diff --git a/dist/0.8629ed7398bb928b5cf9.js b/dist/0.8629ed7398bb928b5cf9.js deleted file mode 100644 index 29a72f0ff..000000000 --- a/dist/0.8629ed7398bb928b5cf9.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(93).concat([function(e,t,n){"use strict";var a=n(11),r=n(29),c=n(102);t.a=()=>{const e=Object(r.a)();return Object(c.a)(()=>a.a(e),[e]),a.b}},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(132),i=n(163),o=n(33),l=n(47),u=n(32);n(196);t.a=e=>{const{ref:t,icon:n,className:d,style:m,children:h,disabled:b,ripple:f,narrow:p,inactive:O,contextActions:g,focus:v,destructive:j,onClick:E}=e;let y=Object(a.q)(null);t&&(y=t);const{isContextMenuOpen:N,contextMenuPosition:T,handleBeforeContextMenu:C,handleContextMenu:M,handleContextMenuClose:w,handleContextMenuHide:I}=Object(s.a)(y,!g),S=Object(a.m)(()=>y.current,[]),L=Object(a.m)(()=>y.current.closest(".custom-scroll"),[]),k=Object(a.m)(()=>y.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:A,positionY:x,style:D}=Object(i.a)(T,S,L,k),_=Object(a.m)(e=>{!b&&E&&E(e)},[b,E]),R=Object(a.m)(e=>{O||r.k||(!g||2!==e.button&&E||C(e),0===e.button&&(E?_(e):M(e)))},[O,g,E,C,M,_]),P=Object(c.a)("ListItem no-selection",d,f&&"has-ripple",p&&"narrow",b&&"disabled",O&&"inactive",T&&"has-menu-open",v&&"focus",j&&"destructive");return a.a.createElement("div",{ref:y,className:P,style:m},a.a.createElement("div",{className:"ListItem-button",role:"button",tabIndex:0,onClick:!O&&r.k?_:void 0,onMouseDown:R,onContextMenu:!O&&g?M:void 0},n&&a.a.createElement("i",{className:"icon-"+n}),h,!b&&!O&&f&&a.a.createElement(o.a,null)),g&&void 0!==T&&a.a.createElement(l.a,{isOpen:N,positionX:A,positionY:x,style:D,className:"ListItem-context-menu",autoClose:!0,onClose:w,onCloseAnimationEnd:I},g.map(e=>a.a.createElement(u.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(9),c=n(43);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},u){const d=Object(a.q)(),m=Object(a.q)(),h=Object(a.q)(),b=Object(a.q)();m.current=u;const f=Object(a.m)(()=>{h.current=!0},[]),p=Object(a.m)(()=>{h.current=!1,b.current&&(b.current(),b.current=void 0)},[]);Object(c.a)(f,p),Object(a.n)(()=>{if(!l)return()=>{d.current&&(d.current.observer.disconnect(),d.current.callbacks.clear(),d.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{d.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},u=t?r.g:n?r.a:void 0,f=u?u(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),h.current?b.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});d.current={observer:p,callbacks:a}}();const l=d.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function i(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return i(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(18),s=n(6),i=n(4),o=n(35),l=n(3),u=n(93),d=n(99),m=n(131),h=n(147);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Db)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withHandle:s,withFullInfo:l,withUpdatingStatus:b,noStatusOrTyping:f,user:p,isSavedMessages:O,areMessagesLoaded:g,lastSyncTime:v,loadFullUser:j,openMediaViewer:E})=>{const{id:y}=p||{},N=Object(i.Z)(p);Object(a.n)(()=>{l&&v&&y&&j({userId:y})},[y,j,v,l]);const T=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),C=Object(u.a)();if(p)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:p.id,size:t,user:p,isSavedMessages:O,onClick:r?T:void 0}),a.a.createElement("div",{className:"info"},O?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,C("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,N&&Object(o.a)(N)),p&&p.isVerified&&a.a.createElement(m.a,null)),!O&&!f&&(n?a.a.createElement("span",{className:"status"},n):b&&!g?a.a.createElement("span",{className:"status"},C("Updating")):p?e?a.a.createElement(h.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.xb)(p)?"online":"")},s&&p.username&&a.a.createElement("span",{className:"handle"},p.username),a.a.createElement("span",{className:"user-status"},Object(i.ab)(p,C))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(48),s=n(29);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,u=Object(s.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?u():setTimeout(u,o-e)})}},[t,e,l,n,i,u,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(50);var c=n(8),s=n(43),i=n(27),o=n(52),l=n(93),u=n(31),d=n(114);n(140);t.a=e=>{const{title:t,className:n,isOpen:m,header:h,hasCloseButton:b,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v}=e,{shouldRender:j,transitionClassNames:E}=Object(i.a)(m,g),y=Object(a.q)(null);Object(a.n)(()=>m?Object(r.a)({onEsc:O,onEnter:v}):void 0,[m,O,v]),Object(a.n)(()=>m&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[m]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",m),(m||!m&&void 0!==e)&&Object(s.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[m]);const N=Object(l.a)();if(!j)return;const T=Object(c.a)("Modal",n,E,f&&"transparent-backdrop");return a.a.createElement(d.a,null,a.a.createElement("div",{ref:y,className:T,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},h||(t?a.a.createElement("div",{className:"modal-header"},b&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:N("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(45),o=n(8),l=n(35),u=n(97),d=n(103),m=n(93);n(183);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:h,text:b,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=h&&Object(s.pb)(h);let j;p||v||(h?j=Object(s.f)(h):n&&(j=Object(s.f)(n)));const E=Object(u.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:N}=Object(d.a)(E,"slow");Object(m.a)();let T="";if(p)T=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)T=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)T=a.a.createElement("img",{src:E,className:N+" avatar-media",alt:"",decoding:"async"});else if(h){const e=Object(s.Z)(h);T=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(n);T=e&&Object(i.c)(e,Object(s.lb)(n.id)?2:1)}else b&&(T=Object(i.c)(b,2));const C=!p&&h&&Object(s.xb)(h),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.X)(h||n),p&&"saved-messages",v&&"deleted-account",f&&C&&"online",g&&"interactive",!p&&!y&&"no-photo"),w=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),I=(h||n)&&(h||n).id;return a.a.createElement("div",{className:M,onClick:w,"data-test-sender-id":c.D?I:void 0},"string"==typeof T?Object(l.a)(T,["jumbo"===t?"hq_emoji":"emoji"]):T)})},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(7),i=n(29),o=n(37),l=n(8),u=n(43);n(181);const d={slide:450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.f?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.a=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:h,shouldCleanup:b,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),N=Object(o.a)(t),T=Object(a.q)(),C=Object(i.a)(),M=void 0!==N&&t!==N;!s&&M&&(y.current={[N]:y.current[N]}),y.current[t]=v,Object(a.o)(()=>{function e(){b&&(y.current={[N]:m},C())}const a=E.current,i=a.children;if(1===i.length&&!M)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!M||!o.length)return;T.current&&(clearTimeout(T.current),T.current=void 0);const l=-1===r||"auto"===r&&N>t||"inverse"===r&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(u.b)(d[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),T.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),h){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},d[n]+c.c),O&&O()})},[t,N,M,r,n,O,g,s,h,b,j,C]),Object(a.o)(()=>{if(h){const e=E.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px")}},[h,v]);const w=y.current,I=Object.keys(s?new Array(s).fill(void 0):w).map(Number).map(e=>{const n=w[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N)):void 0}),S=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:S},I)})},function(e,t,n){"use strict";var a=n(18),r=n(0),c=n(9),s=n(145);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,items:o,itemSelector:l=".ListItem",preloadBackwards:u=20,sensitiveArea:d=800,isDisabled:m=!1,noFastList:h,cacheBuster:b,children:f})=>{let p=Object(r.q)(null);e&&(p=e);const O=Object(r.q)({}),[g,v]=Object(r.p)(()=>n?[Object(c.a)(()=>n({direction:a.e.Backwards}),1e3,!0,!1),Object(c.a)(()=>n({direction:a.e.Forwards}),1e3,!0,!1)]:[],[n,o]);Object(r.n)(()=>{if(g)if(!o||o.length{const e=p.current,t=O.current;if(t.listItemElements=e.querySelectorAll(l),m)return;let n;if(t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&e.offsetParent&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}Object(s.a)(e,n),t.isScrollTopJustUpdated=!0},[m,l,o,b]);const j=Object(r.m)(e=>{if(v&&g){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=O.current;if(t)return void(O.current.isScrollTopJustUpdated=!1);const r=e.length,c=p.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,u=i<=(r?e[0].offsetTop:0)+d,m=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=d;let h=!1;if(u){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(O.current.currentAnchor=t,O.current.currentAnchorTop=e,h=!0,Object(s.a)(c),v())}}if(m){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const n=Object(a.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";var a=n(0),r=n(27);const c={fast:200,slow:350};t.a=(e,t="fast",n=!1)=>{const s=Boolean(e),i=!Object(a.q)(s).current&&!n,[o,l]=Object(a.r)(!s),{shouldRender:u,transitionClassNames:d}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{u&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,u,t]),{shouldRenderThumb:o,shouldRenderFullMedia:u,transitionClassNames:d}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return u})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(49),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,u={width:640,height:640},d={width:100,height:100};let m;function h(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.f?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function b({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(h(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.S)(e)||d;return b({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.bb)(e)||d;return b({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.f?s.pb:s.ob)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},,function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(9),s=n(8),i=n(43),o=n(125);let l,u;async function d(){return l||(l=n.e(7).then(n.bind(null,180)),u=(await l).default),l}setTimeout(d,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:l,playSegment:m,speed:h,noLoop:b,size:f,quality:p,isLowPriority:O,onLoad:g})=>{const[v,j]=Object(a.r)(),E=Object(a.q)(null),y=Object(a.q)(!1),N=Object(a.q)(!1),T=Object(a.q)();T.current=l;const C=Object(a.q)();C.current=m,Object(a.n)(()=>{if(v||!n)return;const e=()=>{if(!E.current)return;const e=new u(t,E.current,n,{noLoop:b,size:f,quality:p,isLowPriority:O},g);h&&e.setSpeed(h),j(e)};u?e():d().then(()=>{Object(c.b)(()=>{E.current&&e()})})},[v,n,t,O,b,g,p,f,h]),Object(a.n)(()=>()=>{v&&v.destroy()},[v]);const M=Object(a.m)((e=!1)=>{v&&(T.current||C.current)&&(C.current?v.playSegment(C.current):e?v.goToAndPlay(0):v.play())},[v]),w=Object(a.m)(()=>{v&&v.pause()},[v]),I=Object(a.m)(()=>{N.current=!0,v&&(y.current||(y.current=v.isPlaying()),w())},[v,w]),S=Object(a.m)(()=>{y.current&&M(),y.current=!1,N.current=!1},[M]),L=Object(a.m)(()=>{Object(c.b)(S)},[S]);Object(a.n)(()=>{v&&(l||m?N.current?y.current=!0:M(b):N.current?y.current=!1:w())},[v,l,m,b,M,w]),Object(i.a)(I,S),Object(o.a)(I,L);const k=Object(s.a)("AnimatedSticker",e,r.d&&l&&"is-playing"),A=f?`width: ${f}px; height: ${f}px;`:void 0;return a.a.createElement("div",{ref:E,className:k,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(93),c=n(98),s=n(31);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,header:i,text:o,textParts:l,confirmLabel:u="Confirm",confirmHandler:d,confirmIsDestructive:m,isButtonsInOneRow:h})=>{const b=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",header:i,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:d},o&&o.split("\\n").map(e=>a.a.createElement("p",null,e)),l,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:d,color:m?"danger":"primary"},u),a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:t},b("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(27);n(235);t.a=Object(a.h)(({text:e="Nothing found."})=>{const{transitionClassNames:t}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",t)},e)})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(102),c=n(29);function s(e,t){const n=void 0===t,s=Object(a.q)(n),i=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(s.current=!1,i.current&&(clearTimeout(i.current),i.current=void 0))},e),Object(a.n)(()=>{if(n||s.current)return;const e=()=>{s.current=!0,o()};t>0?i.current=window.setTimeout(e,t):e()},e),s.current}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(190);t.a=({children:e,className:t,onClick:n})=>{const c=Object(a.m)(e=>{e.preventDefault(),n(e)},[n]);return a.a.createElement("a",{href:"#",className:Object(r.a)("Link",t),onClick:n?c:void 0},e)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(18),s=n(4),i=n(6),o=n(35),l=n(3),u=n(93),d=n(99),m=n(131),h=n(147);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","loadSuperGroupOnlines","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withHandle:r,withFullInfo:i,withUpdatingStatus:l,withChatType:b,chat:f,onlineCount:p,areMessagesLoaded:O,lastSyncTime:g,loadFullChat:v,loadSuperGroupOnlines:j,openMediaViewer:E})=>{const y=f&&Object(s.nb)(f),{id:N,isMin:T,isRestricted:C}=f||{};Object(a.n)(()=>{N&&!T&&i&&g&&(v({chatId:N}),y&&j({chatId:N}))},[N,T,g,i,v,y,j]);const M=Object(a.m)((e,n)=>{f&&n&&(e.stopPropagation(),E({avatarOwnerId:f.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[f,t,E]),w=Object(u.a)();if(f)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:f.id,size:t,chat:f,onClick:n?M:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(o.a)(Object(s.l)(f))),f.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!O&&!C)return a.a.createElement("span",{className:"status"},w("Updating"));if(!f)return;if(e)return a.a.createElement(h.a,{typingStatus:e});if(b)return a.a.createElement("div",{className:"status"},w(Object(s.m)(f)));const t=r?f.username:void 0,n=function(e,t){const n=t(Object(s.m)(e)),{membersCount:a}=e;if(e.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return t("Channel"===n?"Subscribers":"Members",a,"i")}(f,w),c=p?", "+w("OnlineCount",p,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(5),s=n(9),i=n(48),o=n(29);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,u)=>{const d=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.h&&n===c.ApiMediaFormat.Progressive,h=Object(o.a)(),[b,f]=Object(a.r)(d&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(e=>{(!u||Date.now()-p.current>u)&&f(e)},500,!0),[u]);return Object(a.n)(()=>{!t&&e&&(d?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&i.a(O),p.current=Date.now(),i.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!u||e>=u?h():setTimeout(h,u-e)})))},[t,e,d,n,l,h,m,u,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:d,downloadProgress:b}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(207);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:s,noCross:i,onClick:o})=>{const l=c[t],u=l-4,d=l-1,m=2*u*Math.PI,h=Object(a.q)(null);Object(a.n)(()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `},[h,m,d,u,e]);const b=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:h,className:b,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(57);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(18),r=n(43),c=n(9),s=n(55);function i(e,t,n,i=0,o=1500,l,u){if(l===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:d}=t;if(void 0===l){const t=d-e.scrollTop;t<-o?e.scrollTop+=t+o:t>o&&(e.scrollTop+=t-o)}else l===a.b.Up?e.scrollTop=d+o:l===a.b.Down&&(e.scrollTop=Math.max(0,d-o));Object(c.b)(()=>{Object(r.b)(600),function(e,t,n,a=0,r){const{offsetTop:c,offsetHeight:i}=t,{scrollTop:o,offsetHeight:l,scrollHeight:u}=e;let d;switch(n){case"start":d=c-a-o;break;case"end":d=c+i+a-(o+l);break;case"nearest":case"center":d=i0){const e=u-(o+l);d=Math.min(d,e)}const m=e.scrollTop+d,h=r||250+Math.abs(d)/1500*350,b=Date.now();Object(s.b)(()=>{const t=Math.min((Date.now()-b)/h,1),n=d*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(m-n),t<1})}(e,t,n,i,u)})}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(20);n(214);var s=Object(a.h)(({id:e,label:t,subLabel:n,value:s,name:i,checked:o,disabled:l,hidden:u,isLoading:d,onChange:m})=>{const h=Object(r.a)("Radio",l&&"disabled",u&&"hidden-widget",d&&"loading");return a.a.createElement("label",{className:h},a.a.createElement("input",{type:"radio",name:i,value:s,id:e,checked:o,onChange:m,disabled:l||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label"},t),n&&a.a.createElement("span",{className:"subLabel"},n)),d&&a.a.createElement(c.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:i,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(s,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:i?i===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";var a=n(0),r=n(18),c=n(3),s=n(29),i=n(37);function o(e,t=0,n,a){const{length:c}=e,s=e.indexOf(t),i=n===r.e.Forwards?s:s+1||c,o=Math.max(0,i-a),l=i+a-1,u=e.slice(Math.max(0,o),l+1);let d,m;switch(n){case r.e.Forwards:d=i>0,m=o>=0;break;case r.e.Backwards:d=i{const d=Object(a.q)(),m=Object(a.q)((()=>{if(!t||d.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),h=Object(s.a)(),b=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==b||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=d.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&u){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,u]);const p=Object(a.m)(({direction:n})=>{const a=m.current,s=a?n===r.e.Backwards?a[a.length-1]:a[0]:void 0;if(!t)return void(e&&e({offsetId:s}));d.current={...d.current,direction:n,offsetId:s};const{newViewportIds:i,areSomeLocal:u,areAllLocal:b}=o(t,s,n,l);!u||a&&Object(c.a)(a,i)||(m.current=i,h()),!b&&e&&e({offsetId:s})},[t,l,e,h]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(104),i=n(95),o=n(97),l=n(103),u=n(36),d=n(106);n(212);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const h=Object(a.q)(null),[b,f]=Object(u.a)(),p="sticker"+e.id,O=Object(i.b)(h,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,N]=Object(a.r)(String(Math.random())),T=Object(a.m)(()=>{N(String(Math.random()))},[]);let C;C=t?.5*Object(s.l)(e).width:c.ub;const M=`width: ${C}px; height: ${C}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:M,onClick:T},g&&!b&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(d.a,{key:p,id:p,animationData:j,size:C,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},,function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(149);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[s,i]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&i(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:s,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(5),r=n(7);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function s(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);r.c||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1"));return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[*]{1}([^*\n]+)[*]{1}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let s=0,i=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const s=t.indexOf(e.textContent,n),i=s>=0?s:n,o=t.substring(0,i).length,{length:l}=t.substring(i,i+e.textContent.length);let u,d;r===a.ApiMessageEntityTypes.TextUrl&&(u=e.href);r===a.ApiMessageEntityTypes.MentionName&&(d=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...u&&{url:u},...d&&{userId:d}}}}(e,n,s);r?(s=t,o.push(r)):e.textContent&&(s+=e.textContent.length),e.hasChildNodes()&&i<=3&&(i+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{i=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(0),r=n(27),c=n(8),s=n(42),i=n(37),o=n(36);n(202);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,s]=Object(o.a)(),i=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:i,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),s()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(203);let u;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(u||(u={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const u=Object(a.q)(null),d=Object(i.a)(t),{shouldRender:m,transitionClassNames:h}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const b=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(u.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",h);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{u.current&&window.clearTimeout(u.current)},onDrop:n},a.a.createElement(l,{onFileSelect:b}),(t||d)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(35),o=n(8),l=n(93),u=n(99);n(184);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.lb)(t)?Object(c.Db)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:d,chat:m,user:h,className:b})=>{let f,p;if(Object(l.a)(),e&&t)f=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),p=t;else if(m||h){f=a.a.createElement(u.a,{chat:m,user:h,size:"small",isSavedMessages:h&&h.isSelf});const e=!m||h&&!h.isSelf?Object(s.Y)(h):Object(s.l)(m,h);p=e?Object(i.a)(e):void 0}const O=Object(o.a)("PickerSelectedItem",b,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:O,onClick:()=>c(d),title:n?p:void 0},f,!n&&a.a.createElement("div",{className:"item-name"},p),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r=!1;function c(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",i),document.addEventListener("mouseup",s)):"touchstart"===e.type&&(document.addEventListener("touchmove",i),document.addEventListener("touchend",s),document.addEventListener("touchcancel",s),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function s(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",s),document.removeEventListener("mousemove",i),document.removeEventListener("touchcancel",s),document.removeEventListener("touchend",s),document.removeEventListener("touchmove",i),n=void 0,r?t.onRelease&&t.onRelease(e):t.onClick&&t.onClick(e)),r=!1}function i(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const c=e.pageX-n.pageX,s=e.pageY-n.pageY;(Math.abs(c)>=15||Math.abs(s)>=15)&&(r=!0),t.onDrag&&t.onDrag(e,n,{dragOffsetX:c,dragOffsetY:s}),t.onSwipe&&function(e,t,n,r){const c=Math.abs(t),s=Math.abs(n);if(t&&n){if(Math.max(c,s)/Math.min(c,s)<2)return}c>=50?r(e,t<0?a.Left:a.Right):s>=50&&r(e,n<0?a.Up:a.Down)}(e,c,s,t.onSwipe)}}return e.addEventListener("mousedown",c),e.addEventListener("touchstart",c,{passive:!0}),()=>{e.removeEventListener("mousedown",c),e.removeEventListener("touchstart",c)}}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{const t=e.current;if(t)return t.addEventListener("wheel",n,{passive:!0}),()=>{t.removeEventListener("wheel",n)};function n(e){e.deltaX||(t.scrollLeft+=e.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(i,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:s})}},[i,e,t,s]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0);n(191);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";var a=n(0),r=n(7);let c=0;t.a=(e,t)=>{const[n,s]=Object(a.r)(!1),[i,o]=Object(a.r)(void 0),l=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),u=Object(a.m)(e=>{t||(e.preventDefault(),document.body.classList.remove("no-selection"),i||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,s(!0),o({x:e.clientX,y:e.clientY})))},[t,i]),d=Object(a.m)(()=>{s(!1)},[]),m=Object(a.m)(()=>{o(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.k)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},l=e=>{t||r.f&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];i||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),s(!0),o({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",l,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",l),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[i,t,e]),{isContextMenuOpen:n,contextMenuPosition:i,handleBeforeContextMenu:l,handleContextMenu:u,handleContextMenuClose:d,handleContextMenuHide:m}}},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(1);t.a=e=>{e.play().catch(e=>{a.o&&console.warn(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(2),c=n(5),s=n(4),i=n(35),o=n(68),l=n(51);function u(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.N)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function d(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:s}=t,i=new Set([n]);if(r.has(n))return;const o=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(e))),{entity:t,organizedIndexes:i,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,s){if(!t||!t.length)return h(e,n,r,s);const u=[];let m=!1;const O=d(t);function g(t,u,d,O){const v=[],{entity:j,nestedEntities:E}=d,{offset:y,length:N,type:T}=j;let C=e.substring(t,y);const M=C.length;C&&(m&&C.length>0&&"\n"===C[0]&&(C=C.substr(1),m=!1),C&&v.push(...h(C,n,r,s)));const w=t+M,I=w+N;let S=e.substring(y,y+N);const L=[];if(m&&S.length>0&&"\n"===S[0]&&(S=S.substr(1),m=!1),T===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=w;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,I,t,n===E.length-1);L.push(...a),e=r})}const k=s?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(i.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,S,L):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return h(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,h(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,h(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},h(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,h(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},h(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},h(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},h(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,h(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:b(r,e),text:r},h(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,h(s));default:return h(s)}}(j,S,L);if(Array.isArray(k)?v.push(...k):v.push(k),O&&I0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...h(t,n,r,s))}return{renderResult:v,entityEndIndex:I}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);u.push(...a),v=r}),u}function h(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...h(e,t,n,a))}),r}if(a)return Object(i.a)(e,["emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(i.a)(e,[r,"br","highlight"],{highlight:t}):Object(i.a)(e,[r,"br"])}function b(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var a=n(0),r=n(169),c=n(14),s=n(29);const i=new Map;function o(e,t=!1,n){const o=Object(a.q)(e?i.get(e):void 0),l=Object(a.q)(),u=Object(s.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||o.current||t)return;const a=new Image;a.onload=()=>{const t=Object(c.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();o.current=n,u(),i.size>=1e3&&i.clear(),i.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,u,t]),o.current}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(9);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(36),s=n(93),i=n(16),o=n(31);n(182);t.a=Object(a.h)(({ref:e,children:t,value:n,inputId:l,className:u,focused:d,isLoading:m,placeholder:h,disabled:b,canClose:f,onChange:p,onReset:O,onFocus:g,onBlur:v})=>{let j=Object(a.q)(null);e&&(j=e);const[E,y,N]=Object(c.a)(d);Object(a.n)(()=>{j.current&&(d?j.current.focus():j.current.blur())},[d,h]);const T=Object(s.a)();return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,E&&"has-focus")},t,a.a.createElement("input",{ref:j,id:l,type:"text",placeholder:h||T("Search"),className:"form-control",value:n,disabled:b,onChange:function(e){const{currentTarget:t}=e;p(t.value)},onFocus:function(){y(),g&&g()},onBlur:function(){N(),v&&v()}}),a.a.createElement("i",{className:"icon-search"}),m&&a.a.createElement(i.a,null),!m&&(n||f)&&O&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:O},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(9),r=n(55),c=n(7);function s(e,t){c.d?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(7);t.a=(e,t)=>{a.d&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.d&&(e.style.overflow="")}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));function a(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(35);n(192);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Db)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=t&&!t.isSelf&&Object(s.Y)(t);return a.a.createElement("p",{className:"typing-status"},n&&a.a.createElement("span",{className:"sender-name"},Object(i.a)(n)),e.action,a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(3),o=n(93),l=n(99),u=n(98),d=n(31);n(195);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.lb)(t.id),a=Object(c.O)(e,t.id),r=n&&!a,i=t&&Object(s.lb)(t.id)?Object(s.Y)(Object(c.Db)(e,Object(s.T)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.jb)(t),isBasicGroup:Object(s.ib)(t),isSuperGroup:Object(s.nb)(t),canDeleteForAll:r,chatTitle:Object(s.l)(t),contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:s,isSuperGroup:i,canDeleteForAll:m,chatTitle:h,contactName:b,onClose:f,leaveChannel:p,deleteHistory:O,deleteChannel:g})=>{const v=Object(a.m)(()=>{O({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!0}),f()},[O,t.id,t.lastMessage,f]),j=Object(a.m)(()=>{r||s?O({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):!n&&!i||t.isCreator?(n||i)&&t.isCreator&&g({chatId:t.id}):p({chatId:t.id}),f()},[r,s,n,i,t.isCreator,t.lastMessage,t.id,f,O,p,g]),E=Object(o.a)();return a.a.createElement(u.a,{isOpen:e,onClose:f,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header"},a.a.createElement(l.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},n&&!t.isCreator?"Leave Channel?":n&&t.isCreator?"Delete and Leave Channel?":s||i?"Leave Group?":"Delete Chat?"))},n&&!t.isCreator?a.a.createElement("p",null,"Are you sure you want to leave channel ",a.a.createElement("strong",null,h),"?"):n&&t.isCreator?a.a.createElement("p",null,"Are you sure you want to delete and leave channel ",a.a.createElement("strong",null,h),"?"):s||i?a.a.createElement("p",null,"Are you sure you want to leave group ",a.a.createElement("strong",null,h),"?"):a.a.createElement("p",null,"Are you sure you want to delete chat with ",a.a.createElement("strong",null,b),"?"),m&&a.a.createElement(d.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:v},"Delete for ",b?"me and "+b:"Everyone"),a.a.createElement(d.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:j},n&&!t.isCreator?"Leave Channel":n&&t.isCreator?"Delete and Leave Channel":s||i?"Leave Group":"Delete"+(m?" just for me":"")),a.a.createElement(d.a,{className:"confirm-dialog-button",isText:!0,onClick:f},E("Cancel")))}))},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(37);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(53),c=n(4),s=n(95),i=n(112),o=n(97),l=n(167),u=n(168);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:d,withDate:m,datetime:h,className:b,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:N,size:T,timestamp:C}=E,M=Object(s.b)(j,t),[w,I]=Object(a.r)(!1),{mediaData:S,downloadProgress:L}=Object(i.a)(Object(c.D)(e,"download"),!w),{isUploading:k,isTransferring:A,transferProgress:x}=Object(c.s)(e,d||L,w),D=Object(r.c)(E),_=D?Object(c.E)(e):void 0,R=D?E.previewBlobUrl:void 0,P=Object(o.a)(Object(c.D)(e,"pictogram"),!M),F=Object(a.m)(()=>{k?g&&g():I(e=>!e)},[k,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{w&&S&&(Object(l.a)(S,N),I(!1))},[N,S,w]),a.a.createElement(u.a,{ref:j,name:N,extension:y,size:T,timestamp:m?h||C:void 0,thumbnailDataUri:_,previewData:R||P,smaller:n,isTransferring:A,isUploading:k,transferProgress:x,className:b,sender:f,isSelectable:O,isSelected:p,onClick:F,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(12),c=n(17);t.a=e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(42),i=n(27),o=n(69),l=n(36),u=n(93),d=n(31);n(227);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:h})=>{const b=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(i.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[N,T]=Object(a.r)(!1),[C,M]=Object(a.r)(),[w,I]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(h):void 0,[e,h]),Object(o.a)(e,b,h),Object(a.n)(()=>{g?f.current.focus():(y(""),T(!1))},[g]),Object(a.n)(()=>{p||(j(),I({}),M(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.u;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}I(t)},[e,n,v]);const S=Object(a.m)(()=>{if(n)return n.toString()},[n]),L=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function k(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void M(void 0);let r="";a0&&(r+=" mask-left"),M(r)}function A(e){if(w[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(w).some(t=>t!==e&&!!w[t]))return"disabled"}else if(w.monospace||w.strikethrough)return"disabled"}const x=Object(a.m)(()=>{I(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),I(e=>({...e,italic:!e.italic}))},[]),_=Object(a.m)(()=>{document.execCommand("underline"),I(e=>({...e,underline:!e.underline}))},[]),R=Object(a.m)(()=>{if(w.strikethrough){const e=L();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,strikethrough:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[L,S,h,n,w.strikethrough]),P=Object(a.m)(()=>{if(w.monospace){const e=L();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,monospace:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[L,S,h,n,w.monospace]);function F(){const e=E.includes("://")?E:"http://"+E;if(N){const t=L();if(!t||"A"!==t.tagName)return;return t.href=e,void h()}const t=S();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),h()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:_,KeyI:D,KeyM:P,KeyS:R}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,_,P,R,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(u.a)();if(!p)return;const H=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),q=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:b,className:H,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(F(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:"Bold text",className:A("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Italic text",className:A("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Underlined text",className:A("underline"),onClick:_},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Strikethrough text",className:A("strikethrough"),onClick:R},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Monospace text",className:A("monospace"),onClick:P},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",C)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",onChange:function(e){y(e.target.value),k()},onScroll:k})),a.a.createElement("div",{className:q},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:F},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";var a=n(0),r=n(28),c=n(4),s=n(97),i=n(103);n(233);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.E)(e),u=Object(s.a)(Object(c.D)(e,"pictogram")),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:h}=Object(i.a)(u,"slow"),b=Object(c.O)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},d&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:u,className:h+" full-media",alt:""}),b&&a.a.createElement("span",{className:"video-duration"},b.isGif?"GIF":Object(r.e)(b.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(28),i=n(4);var o=n(8),l=n(35);var u=n(112),d=n(27),m=n(121),h=n(165),b=n(93),f=n(31),p=n(113),O=n(110);n(209);const g=c.f?20:25,v=c.f?50:75;function j(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:E,date:y,lastSyncTime:N,className:T,isSelectable:C,isSelected:M,onPlay:w,onReadMedia:I,onCancelUpload:S,onDateClick:L})=>{const{content:{audio:k,voice:A},isMediaUnread:x}=t,D=Boolean(A),_=Object(a.q)(!1),[R,P]=Object(a.r)(!1),F=N,{mediaData:U,downloadProgress:B}=Object(u.a)(Object(i.D)(t,"inline"),!F,Object(i.C)(t,"inline"));const{isBuffered:H,bufferedProgress:q,bufferingHandlers:$,checkBuffering:Y}=Object(m.a)(),{isPlaying:V,playProgress:K,playPause:z,setCurrentTime:W,duration:G}=Object(h.a)(Object(i.A)(t),Object(i.r)(t),U,$,Y,R,(function(){P(!0),w(t.id,t.chatId)}),Object(i.sb)(t));Object(a.n)(()=>{P(V)},[V]);const{isUploading:X,isTransferring:Q,transferProgress:J}=Object(i.s)(t,r||B,R&&!H),{shouldRender:Z,transitionClassNames:ee}=Object(d.a)(Q),te=Object(a.m)(()=>{X?S&&S():(V||w(t.id,t.chatId),P(!R),z())},[V,X,t.id,t.chatId,S,w,z,R]);Object(a.n)(()=>{V&&I&&x&&I()},[V,x,I]);const ne=Object(a.m)(e=>{if(_.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();W(G*((e.clientX-a)/n))}}},[G,W]),ae=Object(a.m)(e=>{_.current=!0,ne(e)},[ne]),re=Object(a.m)(()=>{_.current=!1},[]),ce=Object(a.m)(()=>{L(t.id,t.chatId)},[L,t.id,t.chatId]);Object(b.a)();const se={handleStartSeek:ae,handleSeek:ne,handleStopSeek:re},ie=Object(i.tb)(t),oe=Object(a.p)(()=>A&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const u="dark"===i?"#494B75":"#CBCBCB",d="dark"===i?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",h="dark"===i?"#FFFFFF":"#53ad53",b=Math.min(l/30,1),f=Math.round(g+(v-g)*b),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),s=Math.floor(5*(n-1)%8),i=r[c]+(r[c+1]<<8);return a[n-1]=i>>s&31,a}(new Uint8Array(o)),{data:O,peak:j}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],s=e[e.length-1];for(let u=0;u{i.globalAlpha=s/e.length>=t?.5:1,i.fillStyle=t>s/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(i,4*s,23,2,o,1),i.fill()}),{src:s.toDataURL(),width:c,height:23}}(O,t,{peak:j,fillStyle:n?d:u,progressFillStyle:n?h:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:N,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(A,K,ie,se,e),[A,K,ie,se,e]),le=Object(o.a)("Audio media-inner",T,ie&&!E&&"own",E&&"bigger",M&&"audio-is-selected"),ue=["toggle-play"];Z?ue.push("loading"):V?ue.push("pause"):V||ue.push("play");const de=V||K>0&&K<1,me=Object(o.a)("content",de&&"with-seekline");return a.a.createElement("div",{className:le},C&&a.a.createElement("div",{className:"message-select-control"},M&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!c.f,size:E?"smaller":"tiny",className:ue.join(" "),ariaLabel:V?"Pause audio":"Play audio",onClick:te},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),Z&&a.a.createElement("div",{className:Object(o.a)("media-loading",ee)},a.a.createElement(p.a,{progress:J,transparent:!0,size:E?"m":"s",onClick:te})),"searchResult"===E&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:me},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title"},Object(l.a)(function(){if(D)return n||"Voice";const{title:e,fileName:t}=k;return e||t}())),a.a.createElement("div",{className:"message-date"},y&&a.a.createElement(O.a,{className:"date",onClick:ce},Object(s.g)(1e3*y)))),de&&j(K,q,se),!de&&a.a.createElement("p",{className:"duration"},K>0?Object(s.e)(G*K)+" / ":void 0,function(){if(D)return Object(s.e)(A.duration);const{performer:e}=k;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==E&&k&&function(e,t,n,r,c,i,o){const{title:u,performer:d,duration:m,fileName:h}=e,b=t||n>0&&n<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title"},Object(l.a)(u||h)),b&&j(n,r,c),!b&&a.a.createElement("div",{className:"meta"},a.a.createElement("span",{className:"performer"},Object(l.a)(d||"Unknown")),i&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:o},Object(s.d)(1e3*i)))),a.a.createElement("p",{className:"duration"},n>0?Object(s.e)(m*n)+" / ":void 0,Object(s.e)(m)))}(k,V,K,q,se,y,L?ce:void 0),"searchResult"!==E&&A&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(A,oe,x))}))},function(e,t,n){"use strict";var a=n(0),r=n(144),c=n(37),s=n(129),i=n(93),o=n(8);n(188);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{const u=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[s].querySelector("i");a.classList.remove("animate"),t.classList.remove("animate");const r=a.parentElement.offsetLeft-t.parentElement.offsetLeft,c=a.clientWidth/t.clientWidth;t.style.transform=`translate3d(${r}px, 0, 0) scale3d(${c}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,s]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>i(l),ref:u},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(189);t.a=Object(a.h)(({tabs:e,activeTab:t,onSwitchTab:n})=>{const o=Object(a.q)(null),u=Object(c.a)(t);Object(s.a)(o),Object(a.n)(()=>{const e=o.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const d=Object(i.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar",ref:o},e.map((e,r)=>a.a.createElement(l,{key:e.title,title:d(e.title),active:r===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:n,clickArg:r})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},i=e=>{const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.o&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(4);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:s,isPinned:i})=>{const{toggleChatPinned:o,updateChatMutedState:l,toggleChatArchived:u,toggleChatUnread:d}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:"Mark as Read",icon:"readchats",handler:()=>d({id:e.id})}:{title:"Mark as Unread",icon:"unread",handler:()=>d({id:e.id})},m=i?{title:"Unpin",icon:"unpin",handler:()=>o({id:e.id,folderId:s})}:{title:"Pin",icon:"pin",handler:()=>o({id:e.id,folderId:s})},h=e.isMuted?{title:"Unmute",icon:"unmute",handler:()=>l({chatId:e.id,isMuted:!1})}:{title:"Mute",icon:"mute",handler:()=>l({chatId:e.id,isMuted:!0})},b=Object(c.hb)(e)?{title:"Unarchive",icon:"unarchive",handler:()=>u({id:e.id})}:{title:"Archive",icon:"archive",handler:()=>u({id:e.id})};return[r,m,...a?[]:[h,b],{title:Object(c.lb)(e.id)?"Delete":Object(c.d)(e)?"Delete and Leave":"Leave",icon:"delete",destructive:!0,handler:n}]},[e,t,n,s,i,o,l,u,d])}},function(e,t,n){"use strict";var a=n(0),r=n(28),c=n(162);n(194);t.a=({message:e,outgoingStatus:t})=>a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(c.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(1e3*e.date)))},function(e,t,n){"use strict";var a,r=n(0),c=n(100);n(193);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e})))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,s=0)=>{const[i,o]=Object(a.r)("right"),[l,u]=Object(a.r)("bottom"),[d,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const d={width:0,left:0,height:0,top:0},h=r(),b=n(),f=a.getBoundingClientRect(),p=h?{width:h.offsetWidth,height:h.offsetHeight}:d,O=b?b.getBoundingClientRect():d;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:u,transitionClassNames:d}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),h=Object(c.a)(l),b=Object(a.q)();return m&&!e&&(b.current=h),u&&a.a.createElement("div",{id:n,className:Object(s.a)(i,d),onClick:o},e?l():b.current())}},function(e,t,n){"use strict";var a=n(0),r=n(166),c=n(52),s=n(149),i=n(102);t.a=(e,t,n,o,l,u=!1,d,m=!1)=>{const h=Object(a.q)(null),[b,f]=Object(a.r)(!1);let p=b;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{h.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=h.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},d);const{proxy:n}=h.current;b||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:N}=h.current,T=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{T&&!Object(s.a)(y)&&g(y.currentTime/T)},[T,O,y]),Object(a.n)(()=>()=>{N(m)},[N,m]),Object(c.a)(([e,t])=>{e===u&&n===t||y.src&&y.paused||u&&n&&!b&&v(n)},[u,n,b,v,y.src,y.paused]);const C=Object(a.m)(()=>{b?j():n&&v(n)},[n,j,v,b]);return{isPlaying:p,playProgress:O,playPause:C,setCurrentTime:E,audioProxy:y,duration:T}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return m}));var a=n(7),r=n(134),c=n(149),s=n(2),i=n(4);const o=new Map;let l,u=[];function d(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=u[u.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.zb)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),u.includes(e)||u.push(e));const{audio:d,proxy:m,handlers:h}=o.get(e);return h.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,d.src||(d.src=t,d.preload="auto",t.includes("/progressive/")&&a.i&&Object(c.b)(d)),Object(r.a)(d)},pause(){l===e&&d.pause()},setCurrentTime(t){l===e&&(d.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(u=u.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(27),c=n(103),s=n(8),i=n(28),o=n(53),l=n(104),u=n(35),d=n(113),m=n(110);n(208);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:b,sender:f,thumbnailDataUri:p,previewData:O,className:g,smaller:v,isTransferring:j,isUploading:E,isSelectable:y,isSelected:N,transferProgress:T,onClick:C,onDateClick:M})=>{let w=Object(a.q)(null);e&&(w=e);const{shouldRender:I,transitionClassNames:S}=Object(r.a)(j,void 0,!0),L=Object(o.a)(h),k=Object(o.e)(n),{shouldRenderThumb:A,shouldRenderFullMedia:x,transitionClassNames:D}=Object(c.a)(O,"slow"),{width:_,height:R}=Object(l.i)(v),P=Object(s.a)("File",g,v&&"smaller",C&&!E&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:w,className:P},y&&a.a.createElement("div",{className:"message-select-control"},N&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:E?void 0:C},p||O?a.a.createElement("div",{className:"file-preview media-inner"},A&&a.a.createElement("img",{src:p,width:_,height:R,className:"thumbnail",alt:""}),x&&a.a.createElement("img",{src:O,className:"full-media "+D,width:_,height:R,alt:""})):a.a.createElement("div",{className:"file-icon "+L},h.length<=4&&a.a.createElement("span",{className:"file-ext"},h)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",L,S)},a.a.createElement(d.a,{progress:T,size:v?"s":"m",onClick:E?C:void 0})),C&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title"},Object(u.a)(t)),a.a.createElement("div",{className:"file-subtitle"},a.a.createElement("span",null,j&&T?Math.round(100*T)+"%":k),f&&a.a.createElement("span",{className:"file-sender"},Object(u.a)(f)),!f&&b&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(m.a,{onClick:M},Object(i.d)(1e3*b))))),f&&b&&a.a.createElement(m.a,{onClick:M},Object(i.g)(1e3*b)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,s,i,o){if(Number.isNaN(i)||i<1)return;i|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,s),u=l.data;let d,m,h,b,f,p,O,g,v,j,E,y,N=c-1,T=s-1,C=i+1,M=[],w=[],I=[],S=a[i],L=r[i],k=[],A=[];for(;o-- >0;){for(y=E=0,f=0;fN?N:p)<<2),d+=u[O++],m+=u[O++],h+=u[O++];for(b=0;b0?O<<2:0),g=y+k[b],v=y+A[b],d+=u[g++]-u[v++],m+=u[g++]-u[v++],h+=u[g++]-u[v++],E++;y+=c<<2}for(b=0;bT?0:c,d+=M[j],m+=w[j],h+=I[j];for(E=b<<2,f=0;f>>L,u[E+1]=m*S>>>L,u[E+2]=h*S>>>L,0==b&&(k[f]=((O=f+C)0?O*c:0),g=b+k[f],v=b+A[f],d+=M[g]-M[v],m+=w[g]-w[v],h+=I[g]-I[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(27),s=n(8),i=n(42),o=n(114);n(215);t.a=Object(a.h)(({message:e,duration:t=3e3,onDismiss:n})=>{const[l,u]=Object(a.r)(!0),d=Object(a.q)(null),{transitionClassNames:m}=Object(c.a)(l),h=Object(a.m)(()=>{u(!1),setTimeout(n,150+r.c)},[n]);Object(a.n)(()=>l?Object(i.a)(h):void 0,[l,h]),Object(a.n)(()=>(d.current=window.setTimeout(h,t),()=>{d.current&&(clearTimeout(d.current),d.current=void 0)}),[t,h]);const b=Object(a.m)(()=>{d.current&&(clearTimeout(d.current),d.current=void 0)},[]),f=Object(a.m)(()=>{d.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:"#middle-column-portals"},a.a.createElement("div",{className:Object(s.a)("Notification",m),onClick:h,onMouseEnter:b,onMouseLeave:f},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.u&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.u)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(6),i=n(9),o=n(122),l=n(8),u=n(3),d=n(7),m=n(50),h=n(150),b=n(36),f=n(58),p=n(171),O=n(153);const g=d.f?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.jb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(u.l)(t,["editLastMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:u,onUpdate:v,onSupressedFocus:j,onSend:E,currentChatId:y,replyingToId:N,noTabCapture:T,messageSendKeyCombo:C,editLastMessage:M})=>{const w=Object(a.q)(null),I=Object(a.q)(null),S=Object(a.q)(!1),[L,k,A]=Object(b.a)(),[x,D]=Object(a.r)(),[_,R]=Object(a.r)();Object(h.a)(([e])=>{n!==w.current.innerHTML&&(w.current.innerHTML=n),n!==I.current.innerHTML&&(I.current.innerHTML=n),void 0!==e&&e!==n&&function(){const e=w.current,t=I.current;e.style.height=Math.min(t.scrollHeight,g)+"px",e.classList.toggle("overflown",t.scrollHeight>g)}()},[n]);const P=Object(a.m)(()=>{w.current.closest(".from, .to")?setTimeout(P,350):Object(o.a)(w.current)},[]),F=Object(a.m)(()=>{A(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[A]);function U(){if(d.d)return;const e=window.getSelection();if(!e||!e.rangeCount||S.current)return void A();const t=e.getRangeAt(0),n=t.toString().trim();if(!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void A();const a=t.getBoundingClientRect(),r=w.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),D({x:c,y:a.top-r.top}),R(t),k()}Object(a.n)(()=>{d.k||P()},[y,P,N,s]),Object(a.n)(()=>{if(T)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(P))},2e3,!0,!1);return Object(m.a)({onTab:e})},[P,T]),Object(a.n)(()=>{const e=w.current;function t(){e.blur()}return u&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[u]);const B=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",u&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:u?j:void 0},a.a.createElement("div",{ref:w,id:t||c.u,className:B,contentEditable:!0,onClick:P,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(v("
"===t?"":t),!(d.k||n&&n.length)){const e=window.getSelection();e&&(w.current.blur(),e.removeAllRanges(),Object(o.a)(w.current,!0))}},onKeyDown:function(e){"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length?e.target.addEventListener("keyup",(function t(){U(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),M()):d.d||d.b||!("enter"===C&&!e.shiftKey||"ctrl-enter"===C&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),A(),E())},onMouseDown:function(e){2===e.button?!0!==S.current&&(S.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{S.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{S.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){U(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){d.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){d.b&&U()}}),a.a.createElement("div",{ref:I,className:Object(l.a)(B,"clone")}),a.a.createElement("span",{className:"placeholder-text"},r),a.a.createElement(O.a,{isOpen:L,anchorPosition:x,selectedRange:_,onClose:F}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(146),i=n(35),o=n(28),l=n(154),u=n(110),d=n(51);n(234);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{let m=Object(r.P)(e);if(!m){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.M)(e);m={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const h=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!m)return;const{siteName:b,url:f,displayUrl:p,title:O,description:g,photo:v}=m,j=!t&&Object(s.a)(g,170),E=Object(c.a)("WebLink scroll-item",!v&&"without-photo");return a.a.createElement("div",{className:E,"data-initial":(b||p)[0]},v&&a.a.createElement(l.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{className:"site-title",onClick:h},Object(i.a)(O||b||p)),j&&a.a.createElement(u.a,{className:"site-description",onClick:h},Object(i.a)(j)),a.a.createElement(d.a,{url:f,className:"site-name",text:""},f.replace("mailto:","")||p),t&&a.a.createElement("div",{className:"sender-name"},Object(i.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(u.a,{className:"date",onClick:h},Object(o.g)(1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(37),l=n(3),u=n(4),d=n(6),m=n(118);let h;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(h||(h={}));var b=n(101),f=n(16),p=n(93),O=n(178),g=n(35),v=n(9),j=n(8),E=n(130),y=n(160),N=n(36),T=n(97),C=n(99),M=n(131),w=n(147),I=n(161),S=n(148),L=n(94),k=n(45),A=n(164);n(197);var x=({chat:e,isPinned:t})=>{const n=Boolean(e.unreadCount||e.hasUnreadMark||t),r=Object(j.a)("Badge",e.isMuted&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function c(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:r},Object(k.b)(e.unreadCount))):a.a.createElement("div",{className:r},Object(k.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:r}):t?a.a.createElement("div",{className:r},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(A.a,{isCustom:!0,className:"Badge-transition",isOpen:n},c)};n(198);var D,_=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(d.Db)(e,a):void 0,o=Object(u.t)(n.lastMessage),l=o&&r?Object(d.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:h}=o||{},b=Object(u.T)(n),{type:f}=Object(d.y)(e)||{};return{chat:n,lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(d.cb)(e,n.lastMessage)},...b&&{privateChatUser:Object(d.Db)(e,b)},...m&&{actionTargetUser:Object(d.Db)(e,m)},actionTargetChatId:h,actionTargetMessage:l,draft:Object(d.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:d,privateChatUser:m,actionTargetUser:b,lastMessageSender:f,lastMessageOutgoingStatus:k,actionTargetMessage:A,actionTargetChatId:D,draft:_,messageListType:R,animationLevel:P,lastSyncTime:F,openChat:U,focusLastMessage:B})=>{const H=Object(a.q)(null),[q,$,Y]=Object(N.a)(),{lastMessage:V,typingStatus:K}=d||{},z=V&&Object(u.db)(V);Object(E.a)(t,z?V.replyToMessageId:void 0,A);const W=V&&!Object(u.L)(V)?Object(u.E)(V):void 0,G=Object(T.a)(V?Object(u.D)(V,"micro"):void 0);Object(a.o)(()=>{if(0===P)return;const e=H.current;if(c===h.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==h.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+s.c)},[P,r,c]);const X=Object(a.m)(()=>{U({id:t}),o&&"thread"===R&&B()},[o,R,U,t,B]),Q=Object(y.a)({chat:d,privateChatUser:m,handleDelete:$,folderId:n,isPinned:l}),J=Object(p.a)();if(!d)return;const Z=Object(j.a)("Chat chat-item-clickable",Object(u.lb)(t)?"private":"group",o&&!i.f&&"selected");return a.a.createElement(L.a,{ref:H,className:Z,style:e,ripple:!i.f,contextActions:Q,onClick:X},a.a.createElement(C.a,{chat:d,user:m,withOnlineStatus:!0,isSavedMessages:m&&m.isSelf,lastSyncTime:F}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(u.l)(d,m))),d.isVerified&&a.a.createElement(M.a,null),d.isMuted&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(I.a,{message:d.lastMessage,outgoingStatus:k})),a.a.createElement("div",{className:"subtitle"},function(){if(K&&V&&K.timestamp>1e3*V.date)return a.a.createElement(w.a,{typingStatus:K});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message"},a.a.createElement("span",{className:"draft"},J("Draft")),Object(g.a)(_.text));if(!V)return;if(z){const e=d&&(Object(u.jb)(d)||V.senderId===V.chatId)?d:f;return a.a.createElement("p",{className:"last-message"},Object(g.a)(Object(O.a)(V,e,b,A,D,{asPlain:!0})))}const e=Object(u.I)(t,f);return a.a.createElement("p",{className:"last-message"},e&&a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),function(e,t){if(!t)return Object(g.a)(Object(u.M)(e));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:t,alt:""}),Object(u.O)(e)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(u.M)(e,!0)))}(V,G||W))}(),a.a.createElement(x,{chat:d,isPinned:l}))),a.a.createElement(S.a,{isOpen:q,onClose:Y,chat:d}))}));!function(e){e.all="active",e.archived="archived"}(D||(D={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:u}=Object(d.y)(e)||{},m="folder"!==t?D[t]:void 0,h=n?Object(d.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:h},isInDiscussionThread:u!==c.MAIN_THREAD_ID}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",chatFolder:r,chatsById:c,usersById:d,listIds:p,currentChatId:O,orderedPinnedIds:g,lastSyncTime:v,isInDiscussionThread:j,loadMoreChats:E,preloadTopChatMessages:y})=>{const[N,T]=Object(a.p)(()=>"folder"===e&&r?Object(u.Bb)(c,d,r):[p,g],[e,c,d,r,p,g]),[C,M]=Object(a.p)(()=>{if(!N||"folder"===e&&!r)return[];const t=Object(u.Ab)(c,N,T,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[N,T,e,r,c]),w=Object(o.a)(C),I=C&&w?Object(l.i)(C,(e,t)=>e-(void 0!==w[t]?w[t]:1/0)):{},S=Object(a.m)(()=>{E({listType:"archived"===e?"archived":"active"})},[E,e]),[L,k]=Object(m.a)(v?S:void 0,M,void 0,s.j,"all"===e&&!s.a),A=L&&Object(u.Ab)(c,L,T,e);Object(a.n)(()=>{v&&"all"===e&&y()},[v,e,y]);const x=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,s=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?h.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&sa.a.createElement(_,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===O&&!j,animationType:x(n),orderDiff:I[n],style:`top: ${(e+r)*s.h}px;`})),A.otherChats.map((e,r)=>a.a.createElement(_,{key:e.id,teactOrderKey:Object(u.j)(e),chatId:e.id,folderId:t,isSelected:e.id===O&&!j,animationType:x(e.id),orderDiff:I[e.id],style:`top: ${(n+r)*s.h}px;`})))}():L&&!L.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var a=n(0),r=n(4),c=n(146),s=n(35),i=n(2),o=n(3),l=n(8),u=n(110);var d=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:r})=>{const c=Object(a.m)(()=>{t&&n({id:t.id})},[t,n]);return t?a.a.createElement(u.a,{className:Object(l.a)("UserLink",e),onClick:c},r):r});var m=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:r})=>{const c=Object(a.m)(()=>{t&&r({chatId:t.chatId,messageId:t.id})},[r,t]);return t?a.a.createElement(u.a,{className:Object(l.a)("MessageLink",e),onClick:c},n):n});var h=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:r})=>{const c=Object(a.m)(()=>{t&&n({id:t})},[t,n]);return t?a.a.createElement(u.a,{className:Object(l.a)("ChatLink",e),onClick:c},r):r});function b(e,t,n,i,o,l={}){if(!e.content.action)return[];const{text:u}=e.content.action,d=[],b={...l,maxTextLength:16};let O,g=p(u,"%action_origin%",t?!l.isEmbedded&&(v=t,j=l.asPlain,Object(r.fb)(v)?function(e,t){const n=Object(c.a)(Object(r.l)(e));return t?n:a.a.createElement(h,{className:"action-link",chatId:e.id},e&&Object(s.a)(n))}(v,j):f(v,j))||" ":"User");var v,j;return O=g.pop(),d.push(...g),g=p(O,"%target_user%",n?f(n,l.asPlain):"User"),O=g.pop(),d.push(...g),g=p(O,"%message%",i?function(e,t={}){const n=Object(r.M)(e),{photo:i,video:o,document:l,sticker:u}=Object(r.v)(e),d=n&&!i&&!o&&!l&&!u;let h=Object(c.a)(n,t.maxTextLength);i?h="a photo":o?h=o.isGif?"a GIF":"a video":l?h="a document":u&&(h=`«${n}»`);if(t.asPlain)return d?`«${h}»`:h;if(d)return a.a.createElement("span",null,"«",a.a.createElement(m,{className:"action-link",message:e},Object(s.a)(h)),"»");return a.a.createElement(m,{className:"action-link",message:e},Object(s.a)(h))}(i,b):"a message"),O=g.pop(),d.push(...g),g=p(O,"%product%",i?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(i):"a product"),O=g.pop(),d.push(...g),g=p(O,"%target_chat%",o?function(e,t){if(t)return"another chat";return a.a.createElement(h,{className:"action-link",chatId:e},"another chat")}(o,l.asPlain):"another chat"),d.push(...g),l.asPlain?d.join("").trim():d}function f(e,t){const n=Object(c.a)(Object(r.Z)(e));return t?n:a.a.createElement(d,{className:"action-link",sender:e},e&&Object(s.a)(n))}function p(e,t,n){const a=e.indexOf(t);if(a<0||!n)return[e];const r=[];return r.push(e.substring(0,a)),r.push(n),r.push(e.substring(a+t.length)),r}},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(46);var o=n(7),l=n(122),u=n(36);const d=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.u,h,b,f){const[p,O,g]=Object(u.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),N=Object(a.m)(e=>{if(h&&f)return h.filter(({userId:t})=>{const n=f[t];return!(t===b||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.Z)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[h,b,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(d).pop();if(!n.length||d.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=N(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,N,O,g]);const T=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Y)(e))return;const c=e.username?"@"+e.username:`${Object(s.Y)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.f||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionMenuOpen:p,mentionFilter:v,closeMentionMenu:g,insertMention:T,mentionFilteredMembers:E}}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,function(e,t,n){},,function(e,t,n){},function(e,t,n){},,,,,,,,,,,,function(e,t,n){},,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); -//# sourceMappingURL=0.8629ed7398bb928b5cf9.js.map \ No newline at end of file diff --git a/dist/0.8629ed7398bb928b5cf9.css b/dist/0.fc1c82eed49224140317.css similarity index 100% rename from dist/0.8629ed7398bb928b5cf9.css rename to dist/0.fc1c82eed49224140317.css diff --git a/dist/0.fc1c82eed49224140317.js b/dist/0.fc1c82eed49224140317.js new file mode 100644 index 000000000..2c5575bc2 --- /dev/null +++ b/dist/0.fc1c82eed49224140317.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(94).concat([function(e,t,n){"use strict";var a=n(11),r=n(29),c=n(103);t.a=()=>{const e=Object(r.a)();return Object(c.a)(()=>a.a(e),[e]),a.b}},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(133),i=n(164),o=n(34),l=n(48),u=n(33);n(197);t.a=e=>{const{ref:t,icon:n,className:d,style:m,children:h,disabled:b,ripple:f,narrow:p,inactive:O,contextActions:g,focus:v,destructive:j,onClick:E}=e;let y=Object(a.q)(null);t&&(y=t);const{isContextMenuOpen:N,contextMenuPosition:T,handleBeforeContextMenu:C,handleContextMenu:M,handleContextMenuClose:w,handleContextMenuHide:I}=Object(s.a)(y,!g),S=Object(a.m)(()=>y.current,[]),L=Object(a.m)(()=>y.current.closest(".custom-scroll"),[]),k=Object(a.m)(()=>y.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:A,positionY:x,style:D}=Object(i.a)(T,S,L,k),_=Object(a.m)(e=>{!b&&E&&E(e)},[b,E]),R=Object(a.m)(e=>{O||r.k||(!g||2!==e.button&&E||C(e),0===e.button&&(E?_(e):M(e)))},[O,g,E,C,M,_]),P=Object(c.a)("ListItem no-selection",d,f&&"has-ripple",p&&"narrow",b&&"disabled",O&&"inactive",T&&"has-menu-open",v&&"focus",j&&"destructive");return a.a.createElement("div",{ref:y,className:P,style:m},a.a.createElement("div",{className:"ListItem-button",role:"button",tabIndex:0,onClick:!O&&r.k?_:void 0,onMouseDown:R,onContextMenu:!O&&g?M:void 0},n&&a.a.createElement("i",{className:"icon-"+n}),h,!b&&!O&&f&&a.a.createElement(o.a,null)),g&&void 0!==T&&a.a.createElement(l.a,{isOpen:N,positionX:A,positionY:x,style:D,className:"ListItem-context-menu",autoClose:!0,onClose:w,onCloseAnimationEnd:I},g.map(e=>a.a.createElement(u.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(9),c=n(44);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},u){const d=Object(a.q)(),m=Object(a.q)(),h=Object(a.q)(),b=Object(a.q)();m.current=u;const f=Object(a.m)(()=>{h.current=!0},[]),p=Object(a.m)(()=>{h.current=!1,b.current&&(b.current(),b.current=void 0)},[]);Object(c.a)(f,p),Object(a.n)(()=>{if(!l)return()=>{d.current&&(d.current.observer.disconnect(),d.current.callbacks.clear(),d.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{d.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},u=t?r.g:n?r.a:void 0,f=u?u(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),h.current?b.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});d.current={observer:p,callbacks:a}}();const l=d.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function i(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return i(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(18),s=n(6),i=n(4),o=n(36),l=n(3),u=n(94),d=n(100),m=n(132),h=n(148);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Db)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withHandle:s,withFullInfo:l,withUpdatingStatus:b,noStatusOrTyping:f,user:p,isSavedMessages:O,areMessagesLoaded:g,lastSyncTime:v,loadFullUser:j,openMediaViewer:E})=>{const{id:y}=p||{},N=Object(i.Z)(p);Object(a.n)(()=>{l&&v&&y&&j({userId:y})},[y,j,v,l]);const T=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),C=Object(u.a)();if(p)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:p.id,size:t,user:p,isSavedMessages:O,onClick:r?T:void 0}),a.a.createElement("div",{className:"info"},O?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,C("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,N&&Object(o.a)(N)),p&&p.isVerified&&a.a.createElement(m.a,null)),!O&&!f&&(n?a.a.createElement("span",{className:"status"},n):b&&!g?a.a.createElement("span",{className:"status"},C("Updating")):p?e?a.a.createElement(h.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.xb)(p)?"online":"")},s&&p.username&&a.a.createElement("span",{className:"handle"},p.username),a.a.createElement("span",{className:"user-status"},Object(i.ab)(p,C))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(49),s=n(29);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,u=Object(s.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?u():setTimeout(u,o-e)})}},[t,e,l,n,i,u,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(51);var c=n(8),s=n(44),i=n(27),o=n(53),l=n(94),u=n(32),d=n(115);n(141);t.a=e=>{const{title:t,className:n,isOpen:m,header:h,hasCloseButton:b,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v}=e,{shouldRender:j,transitionClassNames:E}=Object(i.a)(m,g),y=Object(a.q)(null);Object(a.n)(()=>m?Object(r.a)({onEsc:O,onEnter:v}):void 0,[m,O,v]),Object(a.n)(()=>m&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[m]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",m),(m||!m&&void 0!==e)&&Object(s.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[m]);const N=Object(l.a)();if(!j)return;const T=Object(c.a)("Modal",n,E,f&&"transparent-backdrop");return a.a.createElement(d.a,null,a.a.createElement("div",{ref:y,className:T,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},h||(t?a.a.createElement("div",{className:"modal-header"},b&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:N("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(46),o=n(8),l=n(36),u=n(98),d=n(104),m=n(94);n(184);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:h,text:b,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=h&&Object(s.pb)(h);let j;p||v||(h?j=Object(s.f)(h):n&&(j=Object(s.f)(n)));const E=Object(u.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:N}=Object(d.a)(E,"slow");Object(m.a)();let T="";if(p)T=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)T=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)T=a.a.createElement("img",{src:E,className:N+" avatar-media",alt:"",decoding:"async"});else if(h){const e=Object(s.Z)(h);T=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(n);T=e&&Object(i.c)(e,Object(s.lb)(n.id)?2:1)}else b&&(T=Object(i.c)(b,2));const C=!p&&h&&Object(s.xb)(h),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.X)(h||n),p&&"saved-messages",v&&"deleted-account",f&&C&&"online",g&&"interactive",!p&&!y&&"no-photo"),w=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),I=(h||n)&&(h||n).id;return a.a.createElement("div",{className:M,onClick:w,"data-test-sender-id":c.D?I:void 0},"string"==typeof T?Object(l.a)(T,["jumbo"===t?"hq_emoji":"emoji"]):T)})},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(7),i=n(29),o=n(38),l=n(8),u=n(44);n(182);const d={slide:450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.f?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.a=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:h,shouldCleanup:b,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),N=Object(o.a)(t),T=Object(a.q)(),C=Object(i.a)(),M=void 0!==N&&t!==N;!s&&M&&(y.current={[N]:y.current[N]}),y.current[t]=v,Object(a.o)(()=>{function e(){b&&(y.current={[N]:m},C())}const a=E.current,i=a.children;if(1===i.length&&!M)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!M||!o.length)return;T.current&&(clearTimeout(T.current),T.current=void 0);const l=-1===r||"auto"===r&&N>t||"inverse"===r&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(u.b)(d[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),T.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),h){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},d[n]+c.c),O&&O()})},[t,N,M,r,n,O,g,s,h,b,j,C]),Object(a.o)(()=>{if(h){const e=E.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px")}},[h,v]);const w=y.current,I=Object.keys(s?new Array(s).fill(void 0):w).map(Number).map(e=>{const n=w[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N)):void 0}),S=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:S},I)})},function(e,t,n){"use strict";var a=n(18),r=n(0),c=n(9),s=n(146);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,items:o,itemSelector:l=".ListItem",preloadBackwards:u=20,sensitiveArea:d=800,isDisabled:m=!1,noFastList:h,cacheBuster:b,children:f})=>{let p=Object(r.q)(null);e&&(p=e);const O=Object(r.q)({}),[g,v]=Object(r.p)(()=>n?[Object(c.a)(()=>n({direction:a.e.Backwards}),1e3,!0,!1),Object(c.a)(()=>n({direction:a.e.Forwards}),1e3,!0,!1)]:[],[n,o]);Object(r.n)(()=>{if(g)if(!o||o.length{const e=p.current,t=O.current;if(t.listItemElements=e.querySelectorAll(l),m)return;let n;if(t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&e.offsetParent&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}Object(s.a)(e,n),t.isScrollTopJustUpdated=!0},[m,l,o,b]);const j=Object(r.m)(e=>{if(v&&g){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=O.current;if(t)return void(O.current.isScrollTopJustUpdated=!1);const r=e.length,c=p.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,u=i<=(r?e[0].offsetTop:0)+d,m=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=d;let h=!1;if(u){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(O.current.currentAnchor=t,O.current.currentAnchorTop=e,h=!0,Object(s.a)(c),v())}}if(m){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const n=Object(a.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";var a=n(0),r=n(27);const c={fast:200,slow:350};t.a=(e,t="fast",n=!1)=>{const s=Boolean(e),i=!Object(a.q)(s).current&&!n,[o,l]=Object(a.r)(!s),{shouldRender:u,transitionClassNames:d}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{u&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,u,t]),{shouldRenderThumb:o,shouldRenderFullMedia:u,transitionClassNames:d}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return u})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(50),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,u={width:640,height:640},d={width:100,height:100};let m;function h(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.f?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function b({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(h(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.S)(e)||d;return b({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.bb)(e)||d;return b({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.f?s.pb:s.ob)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},,function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(9),s=n(8),i=n(44),o=n(126);let l,u;async function d(){return l||(l=n.e(7).then(n.bind(null,181)),u=(await l).default),l}setTimeout(d,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:l,playSegment:m,speed:h,noLoop:b,size:f,quality:p,isLowPriority:O,onLoad:g})=>{const[v,j]=Object(a.r)(),E=Object(a.q)(null),y=Object(a.q)(!1),N=Object(a.q)(!1),T=Object(a.q)();T.current=l;const C=Object(a.q)();C.current=m,Object(a.n)(()=>{if(v||!n)return;const e=()=>{if(!E.current)return;const e=new u(t,E.current,n,{noLoop:b,size:f,quality:p,isLowPriority:O},g);h&&e.setSpeed(h),j(e)};u?e():d().then(()=>{Object(c.b)(()=>{E.current&&e()})})},[v,n,t,O,b,g,p,f,h]),Object(a.n)(()=>()=>{v&&v.destroy()},[v]);const M=Object(a.m)((e=!1)=>{v&&(T.current||C.current)&&(C.current?v.playSegment(C.current):e?v.goToAndPlay(0):v.play())},[v]),w=Object(a.m)(()=>{v&&v.pause()},[v]),I=Object(a.m)(()=>{N.current=!0,v&&(y.current||(y.current=v.isPlaying()),w())},[v,w]),S=Object(a.m)(()=>{y.current&&M(),y.current=!1,N.current=!1},[M]),L=Object(a.m)(()=>{Object(c.b)(S)},[S]);Object(a.n)(()=>{v&&(l||m?N.current?y.current=!0:M(b):N.current?y.current=!1:w())},[v,l,m,b,M,w]),Object(i.a)(I,S),Object(o.a)(I,L);const k=Object(s.a)("AnimatedSticker",e,r.d&&l&&"is-playing"),A=f?`width: ${f}px; height: ${f}px;`:void 0;return a.a.createElement("div",{ref:E,className:k,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(94),c=n(99),s=n(32);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,header:i,text:o,textParts:l,confirmLabel:u="Confirm",confirmHandler:d,confirmIsDestructive:m,isButtonsInOneRow:h})=>{const b=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",header:i,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:d},o&&o.split("\\n").map(e=>a.a.createElement("p",null,e)),l,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:d,color:m?"danger":"primary"},u),a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:t},b("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(27);n(236);t.a=Object(a.h)(({text:e="Nothing found."})=>{const{transitionClassNames:t}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",t)},e)})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(103),c=n(29);function s(e,t){const n=void 0===t,s=Object(a.q)(n),i=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(s.current=!1,i.current&&(clearTimeout(i.current),i.current=void 0))},e),Object(a.n)(()=>{if(n||s.current)return;const e=()=>{s.current=!0,o()};t>0?i.current=window.setTimeout(e,t):e()},e),s.current}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(191);t.a=({children:e,className:t,onClick:n})=>{const c=Object(a.m)(e=>{e.preventDefault(),n(e)},[n]);return a.a.createElement("a",{href:"#",className:Object(r.a)("Link",t),onClick:n?c:void 0},e)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(18),s=n(4),i=n(6),o=n(36),l=n(3),u=n(94),d=n(100),m=n(132),h=n(148);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","loadSuperGroupOnlines","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withHandle:r,withFullInfo:i,withUpdatingStatus:l,withChatType:b,chat:f,onlineCount:p,areMessagesLoaded:O,lastSyncTime:g,loadFullChat:v,loadSuperGroupOnlines:j,openMediaViewer:E})=>{const y=f&&Object(s.nb)(f),{id:N,isMin:T,isRestricted:C}=f||{};Object(a.n)(()=>{N&&!T&&i&&g&&(v({chatId:N}),y&&j({chatId:N}))},[N,T,g,i,v,y,j]);const M=Object(a.m)((e,n)=>{f&&n&&(e.stopPropagation(),E({avatarOwnerId:f.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[f,t,E]),w=Object(u.a)();if(f)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:f.id,size:t,chat:f,onClick:n?M:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(o.a)(Object(s.l)(f))),f.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!O&&!C)return a.a.createElement("span",{className:"status"},w("Updating"));if(!f)return;if(e)return a.a.createElement(h.a,{typingStatus:e});if(b)return a.a.createElement("div",{className:"status"},w(Object(s.m)(f)));const t=r?f.username:void 0,n=function(e,t){const n=t(Object(s.m)(e)),{membersCount:a}=e;if(e.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return t("Channel"===n?"Subscribers":"Members",a,"i")}(f,w),c=p?", "+w("OnlineCount",p,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(5),s=n(9),i=n(49),o=n(29);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,u)=>{const d=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.h&&n===c.ApiMediaFormat.Progressive,h=Object(o.a)(),[b,f]=Object(a.r)(d&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(e=>{(!u||Date.now()-p.current>u)&&f(e)},500,!0),[u]);return Object(a.n)(()=>{!t&&e&&(d?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&i.a(O),p.current=Date.now(),i.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!u||e>=u?h():setTimeout(h,u-e)})))},[t,e,d,n,l,h,m,u,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:d,downloadProgress:b}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(208);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:s,noCross:i,onClick:o})=>{const l=c[t],u=l-4,d=l-1,m=2*u*Math.PI,h=Object(a.q)(null);Object(a.n)(()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `},[h,m,d,u,e]);const b=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:h,className:b,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(58);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(18),r=n(44),c=n(9),s=n(56);function i(e,t,n,i=0,o=1500,l,u){if(l===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:d}=t;if(void 0===l){const t=d-e.scrollTop;t<-o?e.scrollTop+=t+o:t>o&&(e.scrollTop+=t-o)}else l===a.b.Up?e.scrollTop=d+o:l===a.b.Down&&(e.scrollTop=Math.max(0,d-o));Object(c.b)(()=>{Object(r.b)(600),function(e,t,n,a=0,r){const{offsetTop:c,offsetHeight:i}=t,{scrollTop:o,offsetHeight:l,scrollHeight:u}=e;let d;switch(n){case"start":d=c-a-o;break;case"end":d=c+i+a-(o+l);break;case"nearest":case"center":d=i0){const e=u-(o+l);d=Math.min(d,e)}const m=e.scrollTop+d,h=r||250+Math.abs(d)/1500*350,b=Date.now();Object(s.b)(()=>{const t=Math.min((Date.now()-b)/h,1),n=d*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(m-n),t<1})}(e,t,n,i,u)})}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(20);n(215);var s=Object(a.h)(({id:e,label:t,subLabel:n,value:s,name:i,checked:o,disabled:l,hidden:u,isLoading:d,onChange:m})=>{const h=Object(r.a)("Radio",l&&"disabled",u&&"hidden-widget",d&&"loading");return a.a.createElement("label",{className:h},a.a.createElement("input",{type:"radio",name:i,value:s,id:e,checked:o,onChange:m,disabled:l||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label"},t),n&&a.a.createElement("span",{className:"subLabel"},n)),d&&a.a.createElement(c.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:i,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(s,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:i?i===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";var a=n(0),r=n(18),c=n(3),s=n(29),i=n(38);function o(e,t=0,n,a){const{length:c}=e,s=e.indexOf(t),i=n===r.e.Forwards?s:s+1||c,o=Math.max(0,i-a),l=i+a-1,u=e.slice(Math.max(0,o),l+1);let d,m;switch(n){case r.e.Forwards:d=i>0,m=o>=0;break;case r.e.Backwards:d=i{const d=Object(a.q)(),m=Object(a.q)((()=>{if(!t||d.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),h=Object(s.a)(),b=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==b||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=d.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&u){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,u]);const p=Object(a.m)(({direction:n})=>{const a=m.current,s=a?n===r.e.Backwards?a[a.length-1]:a[0]:void 0;if(!t)return void(e&&e({offsetId:s}));d.current={...d.current,direction:n,offsetId:s};const{newViewportIds:i,areSomeLocal:u,areAllLocal:b}=o(t,s,n,l);!u||a&&Object(c.a)(a,i)||(m.current=i,h()),!b&&e&&e({offsetId:s})},[t,l,e,h]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(105),i=n(96),o=n(98),l=n(104),u=n(37),d=n(107);n(213);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const h=Object(a.q)(null),[b,f]=Object(u.a)(),p="sticker"+e.id,O=Object(i.b)(h,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,N]=Object(a.r)(String(Math.random())),T=Object(a.m)(()=>{N(String(Math.random()))},[]);let C;C=t?.5*Object(s.l)(e).width:c.ub;const M=`width: ${C}px; height: ${C}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:M,onClick:T},g&&!b&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(d.a,{key:p,id:p,animationData:j,size:C,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},,function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(150);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[s,i]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&i(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:s,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(5),r=n(7);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function s(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);r.c||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1"));return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[*]{1}([^*\n]+)[*]{1}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let s=0,i=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const s=t.indexOf(e.textContent,n),i=s>=0?s:n,o=t.substring(0,i).length,{length:l}=t.substring(i,i+e.textContent.length);let u,d;r===a.ApiMessageEntityTypes.TextUrl&&(u=e.href);r===a.ApiMessageEntityTypes.MentionName&&(d=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...u&&{url:u},...d&&{userId:d}}}}(e,n,s);r?(s=t,o.push(r)):e.textContent&&(s+=e.textContent.length),e.hasChildNodes()&&i<=3&&(i+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{i=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(0),r=n(27),c=n(8),s=n(43),i=n(38),o=n(37);n(203);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,s]=Object(o.a)(),i=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:i,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),s()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(204);let u;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(u||(u={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const u=Object(a.q)(null),d=Object(i.a)(t),{shouldRender:m,transitionClassNames:h}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const b=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(u.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",h);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{u.current&&window.clearTimeout(u.current)},onDrop:n},a.a.createElement(l,{onFileSelect:b}),(t||d)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(36),o=n(8),l=n(94),u=n(100);n(185);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.lb)(t)?Object(c.Db)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:d,chat:m,user:h,className:b})=>{let f,p;if(Object(l.a)(),e&&t)f=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),p=t;else if(m||h){f=a.a.createElement(u.a,{chat:m,user:h,size:"small",isSavedMessages:h&&h.isSelf});const e=!m||h&&!h.isSelf?Object(s.Y)(h):Object(s.l)(m,h);p=e?Object(i.a)(e):void 0}const O=Object(o.a)("PickerSelectedItem",b,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:O,onClick:()=>c(d),title:n?p:void 0},f,!n&&a.a.createElement("div",{className:"item-name"},p),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r=!1;function c(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",i),document.addEventListener("mouseup",s)):"touchstart"===e.type&&(document.addEventListener("touchmove",i),document.addEventListener("touchend",s),document.addEventListener("touchcancel",s),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function s(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",s),document.removeEventListener("mousemove",i),document.removeEventListener("touchcancel",s),document.removeEventListener("touchend",s),document.removeEventListener("touchmove",i),n=void 0,r?t.onRelease&&t.onRelease(e):t.onClick&&t.onClick(e)),r=!1}function i(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const c=e.pageX-n.pageX,s=e.pageY-n.pageY;(Math.abs(c)>=15||Math.abs(s)>=15)&&(r=!0),t.onDrag&&t.onDrag(e,n,{dragOffsetX:c,dragOffsetY:s}),t.onSwipe&&function(e,t,n,r){const c=Math.abs(t),s=Math.abs(n);if(t&&n){if(Math.max(c,s)/Math.min(c,s)<2)return}c>=50?r(e,t<0?a.Left:a.Right):s>=50&&r(e,n<0?a.Up:a.Down)}(e,c,s,t.onSwipe)}}return e.addEventListener("mousedown",c),e.addEventListener("touchstart",c,{passive:!0}),()=>{e.removeEventListener("mousedown",c),e.removeEventListener("touchstart",c)}}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{const t=e.current;if(t)return t.addEventListener("wheel",n,{passive:!0}),()=>{t.removeEventListener("wheel",n)};function n(e){e.deltaX||(t.scrollLeft+=e.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(i,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:s})}},[i,e,t,s]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0);n(192);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";var a=n(0),r=n(7);let c=0;t.a=(e,t)=>{const[n,s]=Object(a.r)(!1),[i,o]=Object(a.r)(void 0),l=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),u=Object(a.m)(e=>{t||(e.preventDefault(),document.body.classList.remove("no-selection"),i||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,s(!0),o({x:e.clientX,y:e.clientY})))},[t,i]),d=Object(a.m)(()=>{s(!1)},[]),m=Object(a.m)(()=>{o(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.k)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},l=e=>{t||r.f&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];i||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),s(!0),o({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",l,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",l),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[i,t,e]),{isContextMenuOpen:n,contextMenuPosition:i,handleBeforeContextMenu:l,handleContextMenu:u,handleContextMenuClose:d,handleContextMenuHide:m}}},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(1);t.a=e=>{e.play().catch(e=>{a.o&&console.warn(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(2),c=n(5),s=n(4),i=n(36),o=n(69),l=n(52);function u(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.N)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function d(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:s}=t,i=new Set([n]);if(r.has(n))return;const o=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(e))),{entity:t,organizedIndexes:i,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,s){if(!t||!t.length)return h(e,n,r,s);const u=[];let m=!1;const O=d(t);function g(t,u,d,O){const v=[],{entity:j,nestedEntities:E}=d,{offset:y,length:N,type:T}=j;let C=e.substring(t,y);const M=C.length;C&&(m&&C.length>0&&"\n"===C[0]&&(C=C.substr(1),m=!1),C&&v.push(...h(C,n,r,s)));const w=t+M,I=w+N;let S=e.substring(y,y+N);const L=[];if(m&&S.length>0&&"\n"===S[0]&&(S=S.substr(1),m=!1),T===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=w;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,I,t,n===E.length-1);L.push(...a),e=r})}const k=s?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(i.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,S,L):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return h(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,h(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,h(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},h(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,h(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},h(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},h(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},h(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,h(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:b(r,e),text:r},h(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,h(s));default:return h(s)}}(j,S,L);if(Array.isArray(k)?v.push(...k):v.push(k),O&&I0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...h(t,n,r,s))}return{renderResult:v,entityEndIndex:I}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);u.push(...a),v=r}),u}function h(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...h(e,t,n,a))}),r}if(a)return Object(i.a)(e,["emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(i.a)(e,[r,"br","highlight"],{highlight:t}):Object(i.a)(e,[r,"br"])}function b(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var a=n(0),r=n(170),c=n(14),s=n(29);const i=new Map;function o(e,t=!1,n){const o=Object(a.q)(e?i.get(e):void 0),l=Object(a.q)(),u=Object(s.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||o.current||t)return;const a=new Image;a.onload=()=>{const t=Object(c.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();o.current=n,u(),i.size>=1e3&&i.clear(),i.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,u,t]),o.current}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(9);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(37),s=n(94),i=n(16),o=n(32);n(183);t.a=Object(a.h)(({ref:e,children:t,value:n,inputId:l,className:u,focused:d,isLoading:m,placeholder:h,disabled:b,canClose:f,onChange:p,onReset:O,onFocus:g,onBlur:v})=>{let j=Object(a.q)(null);e&&(j=e);const[E,y,N]=Object(c.a)(d);Object(a.n)(()=>{j.current&&(d?j.current.focus():j.current.blur())},[d,h]);const T=Object(s.a)();return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,E&&"has-focus")},t,a.a.createElement("input",{ref:j,id:l,type:"text",placeholder:h||T("Search"),className:"form-control",value:n,disabled:b,onChange:function(e){const{currentTarget:t}=e;p(t.value)},onFocus:function(){y(),g&&g()},onBlur:function(){N(),v&&v()}}),a.a.createElement("i",{className:"icon-search"}),m&&a.a.createElement(i.a,null),!m&&(n||f)&&O&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:O},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(9),r=n(56),c=n(7);function s(e,t){c.d?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(7);t.a=(e,t)=>{a.d&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.d&&(e.style.overflow="")}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));function a(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(36);n(193);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Db)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=t&&!t.isSelf&&Object(s.Y)(t);return a.a.createElement("p",{className:"typing-status"},n&&a.a.createElement("span",{className:"sender-name"},Object(i.a)(n)),e.action,a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(3),o=n(94),l=n(100),u=n(99),d=n(32);n(196);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.lb)(t.id),a=Object(c.O)(e,t.id),r=n&&!a,i=t&&Object(s.lb)(t.id)?Object(s.Y)(Object(c.Db)(e,Object(s.T)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.jb)(t),isBasicGroup:Object(s.ib)(t),isSuperGroup:Object(s.nb)(t),canDeleteForAll:r,chatTitle:Object(s.l)(t),contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:s,isSuperGroup:i,canDeleteForAll:m,chatTitle:h,contactName:b,onClose:f,leaveChannel:p,deleteHistory:O,deleteChannel:g})=>{const v=Object(a.m)(()=>{O({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!0}),f()},[O,t.id,t.lastMessage,f]),j=Object(a.m)(()=>{r||s?O({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):!n&&!i||t.isCreator?(n||i)&&t.isCreator&&g({chatId:t.id}):p({chatId:t.id}),f()},[r,s,n,i,t.isCreator,t.lastMessage,t.id,f,O,p,g]),E=Object(o.a)();return a.a.createElement(u.a,{isOpen:e,onClose:f,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header"},a.a.createElement(l.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},n&&!t.isCreator?"Leave Channel?":n&&t.isCreator?"Delete and Leave Channel?":s||i?"Leave Group?":"Delete Chat?"))},n&&!t.isCreator?a.a.createElement("p",null,"Are you sure you want to leave channel ",a.a.createElement("strong",null,h),"?"):n&&t.isCreator?a.a.createElement("p",null,"Are you sure you want to delete and leave channel ",a.a.createElement("strong",null,h),"?"):s||i?a.a.createElement("p",null,"Are you sure you want to leave group ",a.a.createElement("strong",null,h),"?"):a.a.createElement("p",null,"Are you sure you want to delete chat with ",a.a.createElement("strong",null,b),"?"),m&&a.a.createElement(d.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:v},"Delete for ",b?"me and "+b:"Everyone"),a.a.createElement(d.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:j},n&&!t.isCreator?"Leave Channel":n&&t.isCreator?"Delete and Leave Channel":s||i?"Leave Group":"Delete"+(m?" just for me":"")),a.a.createElement(d.a,{className:"confirm-dialog-button",isText:!0,onClick:f},E("Cancel")))}))},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(54),c=n(4),s=n(96),i=n(113),o=n(98),l=n(168),u=n(169);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:d,withDate:m,datetime:h,className:b,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:N,size:T,timestamp:C}=E,M=Object(s.b)(j,t),[w,I]=Object(a.r)(!1),{mediaData:S,downloadProgress:L}=Object(i.a)(Object(c.D)(e,"download"),!w),{isUploading:k,isTransferring:A,transferProgress:x}=Object(c.s)(e,d||L,w),D=Object(r.c)(E),_=D?Object(c.E)(e):void 0,R=D?E.previewBlobUrl:void 0,P=Object(o.a)(Object(c.D)(e,"pictogram"),!M),F=Object(a.m)(()=>{k?g&&g():I(e=>!e)},[k,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{w&&S&&(Object(l.a)(S,N),I(!1))},[N,S,w]),a.a.createElement(u.a,{ref:j,name:N,extension:y,size:T,timestamp:m?h||C:void 0,thumbnailDataUri:_,previewData:R||P,smaller:n,isTransferring:A,isUploading:k,transferProgress:x,className:b,sender:f,isSelectable:O,isSelected:p,onClick:F,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(12),c=n(17);t.a=e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(43),i=n(27),o=n(70),l=n(37),u=n(94),d=n(32);n(228);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:h})=>{const b=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(i.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[N,T]=Object(a.r)(!1),[C,M]=Object(a.r)(),[w,I]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(h):void 0,[e,h]),Object(o.a)(e,b,h),Object(a.n)(()=>{g?f.current.focus():(y(""),T(!1))},[g]),Object(a.n)(()=>{p||(j(),I({}),M(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.u;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}I(t)},[e,n,v]);const S=Object(a.m)(()=>{if(n)return n.toString()},[n]),L=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function k(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void M(void 0);let r="";a0&&(r+=" mask-left"),M(r)}function A(e){if(w[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(w).some(t=>t!==e&&!!w[t]))return"disabled"}else if(w.monospace||w.strikethrough)return"disabled"}const x=Object(a.m)(()=>{I(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),I(e=>({...e,italic:!e.italic}))},[]),_=Object(a.m)(()=>{document.execCommand("underline"),I(e=>({...e,underline:!e.underline}))},[]),R=Object(a.m)(()=>{if(w.strikethrough){const e=L();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,strikethrough:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[L,S,h,n,w.strikethrough]),P=Object(a.m)(()=>{if(w.monospace){const e=L();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,monospace:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[L,S,h,n,w.monospace]);function F(){const e=E.includes("://")?E:"http://"+E;if(N){const t=L();if(!t||"A"!==t.tagName)return;return t.href=e,void h()}const t=S();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),h()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:_,KeyI:D,KeyM:P,KeyS:R}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,_,P,R,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(u.a)();if(!p)return;const H=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),q=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:b,className:H,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(F(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:"Bold text",className:A("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Italic text",className:A("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Underlined text",className:A("underline"),onClick:_},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Strikethrough text",className:A("strikethrough"),onClick:R},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Monospace text",className:A("monospace"),onClick:P},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",C)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",onChange:function(e){y(e.target.value),k()},onScroll:k})),a.a.createElement("div",{className:q},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:F},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";var a=n(0),r=n(28),c=n(4),s=n(98),i=n(104);n(234);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.E)(e),u=Object(s.a)(Object(c.D)(e,"pictogram")),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:h}=Object(i.a)(u,"slow"),b=Object(c.O)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},d&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:u,className:h+" full-media",alt:""}),b&&a.a.createElement("span",{className:"video-duration"},b.isGif?"GIF":Object(r.e)(b.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(28),i=n(4);var o=n(8),l=n(36);var u=n(113),d=n(27),m=n(122),h=n(166),b=n(94),f=n(32),p=n(114),O=n(111);n(210);const g=c.f?20:25,v=c.f?50:75;function j(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:E,date:y,lastSyncTime:N,className:T,isSelectable:C,isSelected:M,onPlay:w,onReadMedia:I,onCancelUpload:S,onDateClick:L})=>{const{content:{audio:k,voice:A},isMediaUnread:x}=t,D=Boolean(A),_=Object(a.q)(!1),[R,P]=Object(a.r)(!1),F=N,{mediaData:U,downloadProgress:B}=Object(u.a)(Object(i.D)(t,"inline"),!F,Object(i.C)(t,"inline"));const{isBuffered:H,bufferedProgress:q,bufferingHandlers:$,checkBuffering:Y}=Object(m.a)(),{isPlaying:V,playProgress:K,playPause:z,setCurrentTime:W,duration:G}=Object(h.a)(Object(i.A)(t),Object(i.r)(t),U,$,Y,R,(function(){P(!0),w(t.id,t.chatId)}),Object(i.sb)(t));Object(a.n)(()=>{P(V)},[V]);const{isUploading:X,isTransferring:Q,transferProgress:J}=Object(i.s)(t,r||B,R&&!H),{shouldRender:Z,transitionClassNames:ee}=Object(d.a)(Q),te=Object(a.m)(()=>{X?S&&S():(V||w(t.id,t.chatId),P(!R),z())},[V,X,t.id,t.chatId,S,w,z,R]);Object(a.n)(()=>{V&&I&&x&&I()},[V,x,I]);const ne=Object(a.m)(e=>{if(_.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();W(G*((e.clientX-a)/n))}}},[G,W]),ae=Object(a.m)(e=>{_.current=!0,ne(e)},[ne]),re=Object(a.m)(()=>{_.current=!1},[]),ce=Object(a.m)(()=>{L(t.id,t.chatId)},[L,t.id,t.chatId]);Object(b.a)();const se={handleStartSeek:ae,handleSeek:ne,handleStopSeek:re},ie=Object(i.tb)(t),oe=Object(a.p)(()=>A&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const u="dark"===i?"#494B75":"#CBCBCB",d="dark"===i?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",h="dark"===i?"#FFFFFF":"#53ad53",b=Math.min(l/30,1),f=Math.round(g+(v-g)*b),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),s=Math.floor(5*(n-1)%8),i=r[c]+(r[c+1]<<8);return a[n-1]=i>>s&31,a}(new Uint8Array(o)),{data:O,peak:j}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],s=e[e.length-1];for(let u=0;u{i.globalAlpha=s/e.length>=t?.5:1,i.fillStyle=t>s/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(i,4*s,23,2,o,1),i.fill()}),{src:s.toDataURL(),width:c,height:23}}(O,t,{peak:j,fillStyle:n?d:u,progressFillStyle:n?h:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:N,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(A,K,ie,se,e),[A,K,ie,se,e]),le=Object(o.a)("Audio media-inner",T,ie&&!E&&"own",E&&"bigger",M&&"audio-is-selected"),ue=["toggle-play"];Z?ue.push("loading"):V?ue.push("pause"):V||ue.push("play");const de=V||K>0&&K<1,me=Object(o.a)("content",de&&"with-seekline");return a.a.createElement("div",{className:le},C&&a.a.createElement("div",{className:"message-select-control"},M&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!c.f,size:E?"smaller":"tiny",className:ue.join(" "),ariaLabel:V?"Pause audio":"Play audio",onClick:te},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),Z&&a.a.createElement("div",{className:Object(o.a)("media-loading",ee)},a.a.createElement(p.a,{progress:J,transparent:!0,size:E?"m":"s",onClick:te})),"searchResult"===E&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:me},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title"},Object(l.a)(function(){if(D)return n||"Voice";const{title:e,fileName:t}=k;return e||t}())),a.a.createElement("div",{className:"message-date"},y&&a.a.createElement(O.a,{className:"date",onClick:ce},Object(s.g)(1e3*y)))),de&&j(K,q,se),!de&&a.a.createElement("p",{className:"duration"},K>0?Object(s.e)(G*K)+" / ":void 0,function(){if(D)return Object(s.e)(A.duration);const{performer:e}=k;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==E&&k&&function(e,t,n,r,c,i,o){const{title:u,performer:d,duration:m,fileName:h}=e,b=t||n>0&&n<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title"},Object(l.a)(u||h)),b&&j(n,r,c),!b&&a.a.createElement("div",{className:"meta"},a.a.createElement("span",{className:"performer"},Object(l.a)(d||"Unknown")),i&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:o},Object(s.d)(1e3*i)))),a.a.createElement("p",{className:"duration"},n>0?Object(s.e)(m*n)+" / ":void 0,Object(s.e)(m)))}(k,V,K,q,se,y,L?ce:void 0),"searchResult"!==E&&A&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(A,oe,x))}))},function(e,t,n){"use strict";var a=n(0),r=n(145),c=n(38),s=n(130),i=n(94),o=n(8);n(189);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{const u=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[s].querySelector("i");a.classList.remove("animate"),t.classList.remove("animate");const r=a.parentElement.offsetLeft-t.parentElement.offsetLeft,c=a.clientWidth/t.clientWidth;t.style.transform=`translate3d(${r}px, 0, 0) scale3d(${c}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,s]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>i(l),ref:u},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(190);t.a=Object(a.h)(({tabs:e,activeTab:t,onSwitchTab:n})=>{const o=Object(a.q)(null),u=Object(c.a)(t);Object(s.a)(o),Object(a.n)(()=>{const e=o.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const d=Object(i.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar",ref:o},e.map((e,r)=>a.a.createElement(l,{key:e.title,title:d(e.title),active:r===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:n,clickArg:r})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},i=e=>{const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.o&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(4);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:s,isPinned:i})=>{const{toggleChatPinned:o,updateChatMutedState:l,toggleChatArchived:u,toggleChatUnread:d}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:"Mark as Read",icon:"readchats",handler:()=>d({id:e.id})}:{title:"Mark as Unread",icon:"unread",handler:()=>d({id:e.id})},m=i?{title:"Unpin",icon:"unpin",handler:()=>o({id:e.id,folderId:s})}:{title:"Pin",icon:"pin",handler:()=>o({id:e.id,folderId:s})},h=e.isMuted?{title:"Unmute",icon:"unmute",handler:()=>l({chatId:e.id,isMuted:!1})}:{title:"Mute",icon:"mute",handler:()=>l({chatId:e.id,isMuted:!0})},b=Object(c.hb)(e)?{title:"Unarchive",icon:"unarchive",handler:()=>u({id:e.id})}:{title:"Archive",icon:"archive",handler:()=>u({id:e.id})};return[r,m,...a?[]:[h,b],{title:Object(c.lb)(e.id)?"Delete":Object(c.d)(e)?"Delete and Leave":"Leave",icon:"delete",destructive:!0,handler:n}]},[e,t,n,s,i,o,l,u,d])}},function(e,t,n){"use strict";var a=n(0),r=n(28),c=n(163);n(195);t.a=({message:e,outgoingStatus:t})=>a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(c.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(1e3*e.date)))},function(e,t,n){"use strict";var a,r=n(0),c=n(101);n(194);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e})))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,s=0)=>{const[i,o]=Object(a.r)("right"),[l,u]=Object(a.r)("bottom"),[d,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const d={width:0,left:0,height:0,top:0},h=r(),b=n(),f=a.getBoundingClientRect(),p=h?{width:h.offsetWidth,height:h.offsetHeight}:d,O=b?b.getBoundingClientRect():d;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:u,transitionClassNames:d}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),h=Object(c.a)(l),b=Object(a.q)();return m&&!e&&(b.current=h),u&&a.a.createElement("div",{id:n,className:Object(s.a)(i,d),onClick:o},e?l():b.current())}},function(e,t,n){"use strict";var a=n(0),r=n(167),c=n(53),s=n(150),i=n(103);t.a=(e,t,n,o,l,u=!1,d,m=!1)=>{const h=Object(a.q)(null),[b,f]=Object(a.r)(!1);let p=b;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{h.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=h.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},d);const{proxy:n}=h.current;b||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:N}=h.current,T=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{T&&!Object(s.a)(y)&&g(y.currentTime/T)},[T,O,y]),Object(a.n)(()=>()=>{N(m)},[N,m]),Object(c.a)(([e,t])=>{e===u&&n===t||y.src&&y.paused||u&&n&&!b&&v(n)},[u,n,b,v,y.src,y.paused]);const C=Object(a.m)(()=>{b?j():n&&v(n)},[n,j,v,b]);return{isPlaying:p,playProgress:O,playPause:C,setCurrentTime:E,audioProxy:y,duration:T}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return m}));var a=n(7),r=n(135),c=n(150),s=n(2),i=n(4);const o=new Map;let l,u=[];function d(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=u[u.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.zb)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),u.includes(e)||u.push(e));const{audio:d,proxy:m,handlers:h}=o.get(e);return h.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,d.src||(d.src=t,d.preload="auto",t.includes("/progressive/")&&a.i&&Object(c.b)(d)),Object(r.a)(d)},pause(){l===e&&d.pause()},setCurrentTime(t){l===e&&(d.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(u=u.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(27),c=n(104),s=n(8),i=n(28),o=n(54),l=n(105),u=n(36),d=n(114),m=n(111);n(209);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:b,sender:f,thumbnailDataUri:p,previewData:O,className:g,smaller:v,isTransferring:j,isUploading:E,isSelectable:y,isSelected:N,transferProgress:T,onClick:C,onDateClick:M})=>{let w=Object(a.q)(null);e&&(w=e);const{shouldRender:I,transitionClassNames:S}=Object(r.a)(j,void 0,!0),L=Object(o.a)(h),k=Object(o.e)(n),{shouldRenderThumb:A,shouldRenderFullMedia:x,transitionClassNames:D}=Object(c.a)(O,"slow"),{width:_,height:R}=Object(l.i)(v),P=Object(s.a)("File",g,v&&"smaller",C&&!E&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:w,className:P},y&&a.a.createElement("div",{className:"message-select-control"},N&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:E?void 0:C},p||O?a.a.createElement("div",{className:"file-preview media-inner"},A&&a.a.createElement("img",{src:p,width:_,height:R,className:"thumbnail",alt:""}),x&&a.a.createElement("img",{src:O,className:"full-media "+D,width:_,height:R,alt:""})):a.a.createElement("div",{className:"file-icon "+L},h.length<=4&&a.a.createElement("span",{className:"file-ext"},h)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",L,S)},a.a.createElement(d.a,{progress:T,size:v?"s":"m",onClick:E?C:void 0})),C&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title"},Object(u.a)(t)),a.a.createElement("div",{className:"file-subtitle"},a.a.createElement("span",null,j&&T?Math.round(100*T)+"%":k),f&&a.a.createElement("span",{className:"file-sender"},Object(u.a)(f)),!f&&b&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(m.a,{onClick:M},Object(i.d)(1e3*b))))),f&&b&&a.a.createElement(m.a,{onClick:M},Object(i.g)(1e3*b)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,s,i,o){if(Number.isNaN(i)||i<1)return;i|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,s),u=l.data;let d,m,h,b,f,p,O,g,v,j,E,y,N=c-1,T=s-1,C=i+1,M=[],w=[],I=[],S=a[i],L=r[i],k=[],A=[];for(;o-- >0;){for(y=E=0,f=0;fN?N:p)<<2),d+=u[O++],m+=u[O++],h+=u[O++];for(b=0;b0?O<<2:0),g=y+k[b],v=y+A[b],d+=u[g++]-u[v++],m+=u[g++]-u[v++],h+=u[g++]-u[v++],E++;y+=c<<2}for(b=0;bT?0:c,d+=M[j],m+=w[j],h+=I[j];for(E=b<<2,f=0;f>>L,u[E+1]=m*S>>>L,u[E+2]=h*S>>>L,0==b&&(k[f]=((O=f+C)0?O*c:0),g=b+k[f],v=b+A[f],d+=M[g]-M[v],m+=w[g]-w[v],h+=I[g]-I[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(27),s=n(8),i=n(43),o=n(115);n(216);t.a=Object(a.h)(({message:e,duration:t=3e3,onDismiss:n})=>{const[l,u]=Object(a.r)(!0),d=Object(a.q)(null),{transitionClassNames:m}=Object(c.a)(l),h=Object(a.m)(()=>{u(!1),setTimeout(n,150+r.c)},[n]);Object(a.n)(()=>l?Object(i.a)(h):void 0,[l,h]),Object(a.n)(()=>(d.current=window.setTimeout(h,t),()=>{d.current&&(clearTimeout(d.current),d.current=void 0)}),[t,h]);const b=Object(a.m)(()=>{d.current&&(clearTimeout(d.current),d.current=void 0)},[]),f=Object(a.m)(()=>{d.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:"#middle-column-portals"},a.a.createElement("div",{className:Object(s.a)("Notification",m),onClick:h,onMouseEnter:b,onMouseLeave:f},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.u&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.u)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(6),i=n(9),o=n(123),l=n(8),u=n(3),d=n(7),m=n(51),h=n(151),b=n(37),f=n(59),p=n(172),O=n(154);const g=d.f?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.jb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(u.l)(t,["editLastMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:u,onUpdate:v,onSupressedFocus:j,onSend:E,currentChatId:y,replyingToId:N,noTabCapture:T,messageSendKeyCombo:C,editLastMessage:M})=>{const w=Object(a.q)(null),I=Object(a.q)(null),S=Object(a.q)(!1),[L,k,A]=Object(b.a)(),[x,D]=Object(a.r)(),[_,R]=Object(a.r)();Object(h.a)(([e])=>{n!==w.current.innerHTML&&(w.current.innerHTML=n),n!==I.current.innerHTML&&(I.current.innerHTML=n),void 0!==e&&e!==n&&function(){const e=w.current,t=I.current;e.style.height=Math.min(t.scrollHeight,g)+"px",e.classList.toggle("overflown",t.scrollHeight>g)}()},[n]);const P=Object(a.m)(()=>{w.current.closest(".from, .to")?setTimeout(P,350):Object(o.a)(w.current)},[]),F=Object(a.m)(()=>{A(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[A]);function U(){if(d.d)return;const e=window.getSelection();if(!e||!e.rangeCount||S.current)return void A();const t=e.getRangeAt(0),n=t.toString().trim();if(!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void A();const a=t.getBoundingClientRect(),r=w.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),D({x:c,y:a.top-r.top}),R(t),k()}Object(a.n)(()=>{d.k||P()},[y,P,N,s]),Object(a.n)(()=>{if(T)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(P))},2e3,!0,!1);return Object(m.a)({onTab:e})},[P,T]),Object(a.n)(()=>{const e=w.current;function t(){e.blur()}return u&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[u]);const B=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",u&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:u?j:void 0},a.a.createElement("div",{ref:w,id:t||c.u,className:B,contentEditable:!0,onClick:P,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(v("
"===t?"":t),!(d.k||n&&n.length)){const e=window.getSelection();e&&(w.current.blur(),e.removeAllRanges(),Object(o.a)(w.current,!0))}},onKeyDown:function(e){"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length?e.target.addEventListener("keyup",(function t(){U(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),M()):d.d||d.b||!("enter"===C&&!e.shiftKey||"ctrl-enter"===C&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),A(),E())},onMouseDown:function(e){2===e.button?!0!==S.current&&(S.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{S.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{S.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){U(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){d.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){d.b&&U()}}),a.a.createElement("div",{ref:I,className:Object(l.a)(B,"clone")}),a.a.createElement("span",{className:"placeholder-text"},r),a.a.createElement(O.a,{isOpen:L,anchorPosition:x,selectedRange:_,onClose:F}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(147),i=n(36),o=n(28),l=n(155),u=n(111),d=n(52);n(235);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{let m=Object(r.P)(e);if(!m){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.M)(e);m={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const h=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!m)return;const{siteName:b,url:f,displayUrl:p,title:O,description:g,photo:v}=m,j=!t&&Object(s.a)(g,170),E=Object(c.a)("WebLink scroll-item",!v&&"without-photo");return a.a.createElement("div",{className:E,"data-initial":(b||p)[0]},v&&a.a.createElement(l.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{className:"site-title",onClick:h},Object(i.a)(O||b||p)),j&&a.a.createElement(u.a,{className:"site-description",onClick:h},Object(i.a)(j)),a.a.createElement(d.a,{url:f,className:"site-name",text:""},f.replace("mailto:","")||p),t&&a.a.createElement("div",{className:"sender-name"},Object(i.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(u.a,{className:"date",onClick:h},Object(o.g)(1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(38),l=n(3),u=n(4),d=n(6),m=n(119);let h;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(h||(h={}));var b=n(102),f=n(16),p=n(94),O=n(179),g=n(36),v=n(9),j=n(8),E=n(131),y=n(161),N=n(37),T=n(98),C=n(100),M=n(132),w=n(148),I=n(162),S=n(149),L=n(95),k=n(46),A=n(165);n(198);var x=({chat:e,isPinned:t})=>{const n=Boolean(e.unreadCount||e.hasUnreadMark||t),r=Object(j.a)("Badge",e.isMuted&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function c(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:r},Object(k.b)(e.unreadCount))):a.a.createElement("div",{className:r},Object(k.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:r}):t?a.a.createElement("div",{className:r},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(A.a,{isCustom:!0,className:"Badge-transition",isOpen:n},c)};n(199);var D,_=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(d.Db)(e,a):void 0,o=Object(u.t)(n.lastMessage),l=o&&r?Object(d.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:h}=o||{},b=Object(u.T)(n),{type:f}=Object(d.y)(e)||{};return{chat:n,lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(d.cb)(e,n.lastMessage)},...b&&{privateChatUser:Object(d.Db)(e,b)},...m&&{actionTargetUser:Object(d.Db)(e,m)},actionTargetChatId:h,actionTargetMessage:l,draft:Object(d.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:d,privateChatUser:m,actionTargetUser:b,lastMessageSender:f,lastMessageOutgoingStatus:k,actionTargetMessage:A,actionTargetChatId:D,draft:_,messageListType:R,animationLevel:P,lastSyncTime:F,openChat:U,focusLastMessage:B})=>{const H=Object(a.q)(null),[q,$,Y]=Object(N.a)(),{lastMessage:V,typingStatus:K}=d||{},z=V&&Object(u.db)(V);Object(E.a)(t,z?V.replyToMessageId:void 0,A);const W=V&&!Object(u.L)(V)?Object(u.E)(V):void 0,G=Object(T.a)(V?Object(u.D)(V,"micro"):void 0);Object(a.o)(()=>{if(0===P)return;const e=H.current;if(c===h.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==h.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+s.c)},[P,r,c]);const X=Object(a.m)(()=>{U({id:t}),o&&"thread"===R&&B()},[o,R,U,t,B]),Q=Object(y.a)({chat:d,privateChatUser:m,handleDelete:$,folderId:n,isPinned:l}),J=Object(p.a)();if(!d)return;const Z=Object(j.a)("Chat chat-item-clickable",Object(u.lb)(t)?"private":"group",o&&!i.f&&"selected");return a.a.createElement(L.a,{ref:H,className:Z,style:e,ripple:!i.f,contextActions:Q,onClick:X},a.a.createElement(C.a,{chat:d,user:m,withOnlineStatus:!0,isSavedMessages:m&&m.isSelf,lastSyncTime:F}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(u.l)(d,m))),d.isVerified&&a.a.createElement(M.a,null),d.isMuted&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(I.a,{message:d.lastMessage,outgoingStatus:k})),a.a.createElement("div",{className:"subtitle"},function(){if(K&&V&&K.timestamp>1e3*V.date)return a.a.createElement(w.a,{typingStatus:K});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message"},a.a.createElement("span",{className:"draft"},J("Draft")),Object(g.a)(_.text));if(!V)return;if(z){const e=d&&(Object(u.jb)(d)||V.senderId===V.chatId)?d:f;return a.a.createElement("p",{className:"last-message"},Object(g.a)(Object(O.a)(V,e,b,A,D,{asPlain:!0})))}const e=Object(u.I)(t,f);return a.a.createElement("p",{className:"last-message"},e&&a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),function(e,t){if(!t)return Object(g.a)(Object(u.M)(e));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:t,alt:""}),Object(u.O)(e)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(u.M)(e,!0)))}(V,G||W))}(),a.a.createElement(x,{chat:d,isPinned:l}))),a.a.createElement(S.a,{isOpen:q,onClose:Y,chat:d}))}));!function(e){e.all="active",e.archived="archived"}(D||(D={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:u}=Object(d.y)(e)||{},m="folder"!==t?D[t]:void 0,h=n?Object(d.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:h},isInDiscussionThread:u!==c.MAIN_THREAD_ID}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",chatFolder:r,chatsById:c,usersById:d,listIds:p,currentChatId:O,orderedPinnedIds:g,lastSyncTime:v,isInDiscussionThread:j,loadMoreChats:E,preloadTopChatMessages:y})=>{const[N,T]=Object(a.p)(()=>"folder"===e&&r?Object(u.Bb)(c,d,r):[p,g],[e,c,d,r,p,g]),[C,M]=Object(a.p)(()=>{if(!N||"folder"===e&&!r)return[];const t=Object(u.Ab)(c,N,T,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[N,T,e,r,c]),w=Object(o.a)(C),I=C&&w?Object(l.i)(C,(e,t)=>e-(void 0!==w[t]?w[t]:1/0)):{},S=Object(a.m)(()=>{E({listType:"archived"===e?"archived":"active"})},[E,e]),[L,k]=Object(m.a)(v?S:void 0,M,void 0,s.j,"all"===e&&!s.a),A=L&&Object(u.Ab)(c,L,T,e);Object(a.n)(()=>{v&&"all"===e&&y()},[v,e,y]);const x=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,s=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?h.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&sa.a.createElement(_,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===O&&!j,animationType:x(n),orderDiff:I[n],style:`top: ${(e+r)*s.h}px;`})),A.otherChats.map((e,r)=>a.a.createElement(_,{key:e.id,teactOrderKey:Object(u.j)(e),chatId:e.id,folderId:t,isSelected:e.id===O&&!j,animationType:x(e.id),orderDiff:I[e.id],style:`top: ${(n+r)*s.h}px;`})))}():L&&!L.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var a=n(0),r=n(4),c=n(147),s=n(36),i=n(2),o=n(3),l=n(8),u=n(111);var d=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:r})=>{const c=Object(a.m)(()=>{t&&n({id:t.id})},[t,n]);return t?a.a.createElement(u.a,{className:Object(l.a)("UserLink",e),onClick:c},r):r});var m=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:r})=>{const c=Object(a.m)(()=>{t&&r({chatId:t.chatId,messageId:t.id})},[r,t]);return t?a.a.createElement(u.a,{className:Object(l.a)("MessageLink",e),onClick:c},n):n});var h=Object(i.h)(void 0,(e,t)=>Object(o.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:r})=>{const c=Object(a.m)(()=>{t&&n({id:t})},[t,n]);return t?a.a.createElement(u.a,{className:Object(l.a)("ChatLink",e),onClick:c},r):r});function b(e,t,n,i,o,l={}){if(!e.content.action)return[];const{text:u}=e.content.action,d=[],b={...l,maxTextLength:16};let O,g=p(u,"%action_origin%",t?!l.isEmbedded&&(v=t,j=l.asPlain,Object(r.fb)(v)?function(e,t){const n=Object(c.a)(Object(r.l)(e));return t?n:a.a.createElement(h,{className:"action-link",chatId:e.id},e&&Object(s.a)(n))}(v,j):f(v,j))||" ":"User");var v,j;return O=g.pop(),d.push(...g),g=p(O,"%target_user%",n?f(n,l.asPlain):"User"),O=g.pop(),d.push(...g),g=p(O,"%message%",i?function(e,t={}){const n=Object(r.M)(e),{photo:i,video:o,document:l,sticker:u}=Object(r.v)(e),d=n&&!i&&!o&&!l&&!u;let h=Object(c.a)(n,t.maxTextLength);i?h="a photo":o?h=o.isGif?"a GIF":"a video":l?h="a document":u&&(h=`«${n}»`);if(t.asPlain)return d?`«${h}»`:h;if(d)return a.a.createElement("span",null,"«",a.a.createElement(m,{className:"action-link",message:e},Object(s.a)(h)),"»");return a.a.createElement(m,{className:"action-link",message:e},Object(s.a)(h))}(i,b):"a message"),O=g.pop(),d.push(...g),g=p(O,"%product%",i?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(i):"a product"),O=g.pop(),d.push(...g),g=p(O,"%target_chat%",o?function(e,t){if(t)return"another chat";return a.a.createElement(h,{className:"action-link",chatId:e},"another chat")}(o,l.asPlain):"another chat"),d.push(...g),l.asPlain?d.join("").trim():d}function f(e,t){const n=Object(c.a)(Object(r.Z)(e));return t?n:a.a.createElement(d,{className:"action-link",sender:e},e&&Object(s.a)(n))}function p(e,t,n){const a=e.indexOf(t);if(a<0||!n)return[e];const r=[];return r.push(e.substring(0,a)),r.push(n),r.push(e.substring(a+t.length)),r}},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(47);var o=n(7),l=n(123),u=n(37);const d=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.u,h,b,f){const[p,O,g]=Object(u.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),N=Object(a.m)(e=>{if(h&&f)return h.filter(({userId:t})=>{const n=f[t];return!(t===b||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.Z)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[h,b,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(d).pop();if(!n.length||d.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=N(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,N,O,g]);const T=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Y)(e))return;const c=e.username?"@"+e.username:`${Object(s.Y)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.f||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionMenuOpen:p,mentionFilter:v,closeMentionMenu:g,insertMention:T,mentionFilteredMembers:E}}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,function(e,t,n){},,function(e,t,n){},function(e,t,n){},,,,,,,,,,,,function(e,t,n){},,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); +//# sourceMappingURL=0.fc1c82eed49224140317.js.map \ No newline at end of file diff --git a/dist/0.8629ed7398bb928b5cf9.js.map b/dist/0.fc1c82eed49224140317.js.map similarity index 99% rename from dist/0.8629ed7398bb928b5cf9.js.map rename to dist/0.fc1c82eed49224140317.js.map index 892adf282..62f794a36 100644 --- a/dist/0.8629ed7398bb928b5cf9.js.map +++ b/dist/0.fc1c82eed49224140317.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/hooks/useLang.ts","webpack:///./src/components/ui/ListItem.tsx","webpack:///./src/hooks/useIntersectionObserver.ts","webpack:///./src/components/common/PrivateChatInfo.tsx","webpack:///./src/hooks/useMedia.ts","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/Avatar.tsx","webpack:///./src/components/ui/Transition.tsx","webpack:///./src/components/ui/InfiniteScroll.tsx","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/hooks/useTransitionForMedia.ts","webpack:///./src/components/common/helpers/mediaDimensions.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/ConfirmDialog.tsx","webpack:///./src/components/common/NothingFound.tsx","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/hooks/useBuffering.ts","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/components/middle/composer/helpers/parseMessageInput.ts","webpack:///./src/components/middle/composer/DropTarget.tsx","webpack:///./src/components/middle/composer/DropArea.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PickerSelectedItem.tsx","webpack:///./src/util/captureEvents.ts","webpack:///./src/hooks/useHorizontalScroll.ts","webpack:///./src/hooks/useEnsureMessage.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/hooks/useContextMenuHandlers.ts","webpack:///./src/util/cycleRestrict.ts","webpack:///./src/util/safePlay.ts","webpack:///./src/components/common/helpers/renderMessageText.tsx","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useVideoCleanup.ts","webpack:///./src/components/ui/SearchInput.tsx","webpack:///./src/util/fastSmoothScrollHorizontal.ts","webpack:///./src/util/resetScroll.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/common/TypingStatus.tsx","webpack:///./src/components/common/DeleteChatModal.tsx","webpack:///./src/util/patchSafariProgressiveAudio.ts","webpack:///./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack:///./src/components/common/Document.tsx","webpack:///./src/components/common/StickerSetModal.async.tsx","webpack:///./src/components/middle/composer/TextFormatter.tsx","webpack:///./src/components/common/Media.tsx","webpack:///./src/components/common/Audio.tsx","webpack:///./src/util/waveform.ts","webpack:///./src/components/common/helpers/waveform.ts","webpack:///./src/components/ui/Tab.tsx","webpack:///./src/components/ui/TabList.tsx","webpack:///./src/util/getReadableErrorText.ts","webpack:///./src/util/clipboard.ts","webpack:///./src/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","webpack:///./src/hooks/useAudioPlayer.ts","webpack:///./src/util/audioPlayer.ts","webpack:///./src/util/download.ts","webpack:///./src/components/common/File.tsx","webpack:///./src/lib/fastBlur.js","webpack:///./src/components/ui/Notification.tsx","webpack:///./src/components/middle/composer/helpers/selection.ts","webpack:///./src/components/middle/composer/MessageInput.tsx","webpack:///./src/components/common/WebLink.tsx","webpack:///./src/components/left/main/hooks/useChatAnimationType.ts","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/components/middle/composer/hooks/useMentionMenu.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.ts"],"names":["forceUpdate","useForceUpdate","useOnChange","langProvider","ListItem","props","ref","icon","className","style","children","disabled","ripple","narrow","inactive","contextActions","focus","destructive","onClick","containerRef","useRef","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","button","fullClassName","buildClassName","role","tabIndex","undefined","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","isFrozenRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","useEffect","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","Array","from","values","forEach","entry","callback","get","scheduler","throttle","debounce","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","useIsIntersecting","isIntersecting","setIsIntersecting","useState","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withHandle","withFullInfo","withUpdatingStatus","noStatusOrTyping","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","lang","useLang","size","renderText","isVerified","isUserOnline","username","getUserStatus","mediaHash","noLoad","mediaFormat","ApiMediaFormat","BlobUrl","cacheBuster","delay","mediaData","mediaLoader","startedAt","Date","now","then","spentTime","setTimeout","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","chat","text","withOnlineStatus","isDeleted","isDeletedUser","imageHash","getChatAvatarHash","dataUri","useMedia","DataUri","shouldRenderFullMedia","useTransitionForMedia","content","src","alt","decoding","userFullName","getFirstLetters","getChatTitle","isChatPrivate","isOnline","getUserColorKey","senderId","data-test-sender-id","IS_TEST","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","renders","contents","fill","render","InfiniteScroll","onLoadMore","onScroll","items","itemSelector","preloadBackwards","sensitiveArea","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","LoadMoreDirection","Backwards","Forwards","scrollHeight","state","listItemElements","newScrollTop","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","offsetParent","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","teactFastList","cb","dependencies","prevDeps","some","d","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","occupiedHeightRem","matches","calculateInlineImageDimensions","photo","getPhotoInlineDimensions","calculateVideoDimensions","video","getVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","smaller","getStickerDimensions","sticker","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","lottiePromise","RLottie","async","ensureLottie","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","IS_IOS","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","useAsyncRendering","shouldRenderRef","timeoutRef","Link","href","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","loadSuperGroupOnlines","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isStreaming","Stream","IS_PROGRESSIVE_SUPPORTED","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","isSafariPatchInProgress","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","checkBuffering","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","ENTITY_CLASS_BY_NODE_NAME","B","ApiMessageEntityTypes","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","parseMessageInput","html","fragment","parsedHtml","IS_EMOJI_SUPPORTED","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","dataset","entityType","MentionName","startsWith","Email","Phone","textContent","TextUrl","Url","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","push","hasChildNodes","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","onBlur","onFocus","hasFocus","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","SwipeDirection","captureEvents","captureEvent","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","VerifiedIcon","contextMenuCounter","isMenuDisabled","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","cycleRestrict","mediaEl","catch","err","DEBUG","console","warn","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","getMessageText","renderTextWithEntities","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","cache","useBlur","blurredRef","img","Image","onload","canvas","imgToCanvas","fastBlur","getContext","blurredDataUri","toDataURL","useVideoCleanup","videoRef","videoEl","load","inputId","focused","placeholder","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","containerWidth","scrollWidth","animate","scrollTo","overflow","trimText","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","chatTitle","leaveChannel","deleteHistory","deleteChannel","handleDeleteMessageForAll","maxId","lastMessage","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModalAsync","StickerSetModal","useModuleLoader","Bundles","Extra","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","EDITABLE_INPUT_ID","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","onKeyDown","autoComplete","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","isOwnMessage","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","data","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","idx","val","interpolateArray","fillStyle","progressFillStyle","ctx","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","ProgressSpinner","getFirstLine","formatPastTimeShort","performer","getSecondLine","formatMediaDateTime","renderAudio","renderVoice","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","fastSmoothScrollHorizontal","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","getReadableErrorText","error","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","copyImageToClipboard","imageUrl","imageEl","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","LastMessageMeta","outgoingStatus","Keys","MessageOutgoingStatus","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","trackId","originalDuration","handlers","onInit","shouldPlay","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","tracks","currentTrackId","queue","stopCurrentAudio","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","parseMessageKey","nextTrack","safePlay","Proxy","createAudio","preload","IS_SAFARI","time","shouldRemoveFromQueue","track","h","filename","link","click","shouldSpinnerRender","getColorFromExtension","sizeString","getFileSizeString","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","onUpdate","onSupressedFocus","onSend","editLastMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","useLayoutEffectWithPrevDeps","prevHtml","clone","updateInputHeight","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","parseEmojiOnlyString","START_TO_END","selectionRect","inputRect","captureFirstTab","onTab","supressFocus","contentEditable","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","description","handleMessageClick","displayUrl","truncatedDescription","data-initial","ChatAnimationTypes","Badge","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","Opacity","opacity","Move","useChatContextActions","Avatar","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","byId","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","noChatsText","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","mapValues","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","openUserInfo","focusMessage","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","isChat","renderChatContent","renderUserContent","pop","getMessageContent","showQuotes","renderMessageContent","invoice","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","RE_NOT_USERNAME_SEARCH","useMentionMenu","canSuggestMembers","onUpdateHtml","groupChatMembers","currentUserId","markIsOpen","unmarkIsOpen","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","toLowerCase","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","tempEl","lastSymbol","lastWord","test","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","atIndex","lastIndexOf","messageInput","getElementById","isMentionMenuOpen","mentionFilter","closeMentionMenu","mentionFilteredMembers"],"mappings":"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,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,G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","file":"0.8629ed7398bb928b5cf9.js","sourcesContent":["import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ntype OnClickHandler = (e: React.MouseEvent) => void;\n\ntype MenuItemContextAction = {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n};\n\ntype OwnProps = {\n ref?: RefObject;\n icon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n contextActions?: MenuItemContextAction[];\n onClick?: OnClickHandler;\n};\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n contextActions,\n focus,\n destructive,\n onClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const fullClassName = buildClassName(\n 'ListItem no-selection',\n className,\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {children}\n {!disabled && !inactive && ripple && (\n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (isFrozenRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withHandle?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withHandle,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withHandle && user.username && {user.username}}\n {getUserStatus(user, lang)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user && user.isVerified && }\n
\n )}\n {!isSavedMessages && !noStatusOrTyping && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const areMessagesLoaded = Boolean(selectChatMessages(global, userId));\n\n return {\n lastSyncTime, user, isSavedMessages, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash, getChatTitle, isChatPrivate,\n getUserFullName, isUserOnline, isDeletedUser, getUserColorKey,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n withOnlineStatus?: boolean;\n chat?: ApiChat;\n user?: ApiUser;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n text,\n withOnlineStatus,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow');\n\n useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (shouldRenderFullMedia) {\n content = \"\";\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && isUserOnline(user);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, isSavedMessages || shouldRenderFullMedia);\n }\n }, [onClick, isSavedMessages, shouldRenderFullMedia]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'fade' | 'slide-layers'\n | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nconst ANIMATION_DURATION = {\n slide: 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const activateTimeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n childElements[0].classList.add('active');\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\n }\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'none' || animationLevel === 0) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('active');\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\n requestAnimationFrame(() => {\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\n }\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector('.active');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n\n if (onStart) {\n onStart();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector('.active')\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(Transition);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection }) => void;\n onScroll?: (e: UIEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n isDisabled?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n isDisabled = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements: NodeListOf;\n isScrollTopJustUpdated: boolean;\n currentAnchor: HTMLDivElement | undefined;\n currentAnchorTop: number;\n }>({} as any);\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (!items || items.length < preloadBackwards) {\n loadMoreBackwards();\n } else {\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n if (isDisabled) {\n return;\n }\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor && nextAnchor.offsetParent) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [isDisabled, itemSelector, items, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n
\n {children}\n
\n );\n};\n\nexport default InfiniteScroll;\n","import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","import { useEffect, useRef, useState } from '../lib/teact/teact';\n\nimport useShowTransition from './useShowTransition';\n\nconst SPEED = {\n fast: 200,\n slow: 350,\n};\n\nexport default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => {\n const isMediaLoaded = Boolean(mediaData);\n const willAnimate = !useRef(isMediaLoaded).current && !noAnimate;\n const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded);\n\n const {\n shouldRender: shouldRenderFullMedia,\n transitionClassNames,\n } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed);\n\n useEffect(() => {\n if (shouldRenderFullMedia) {\n if (willAnimate) {\n setTimeout(() => {\n setShouldRenderThumb(false);\n }, SPEED[speed]);\n } else {\n setShouldRenderThumb(false);\n }\n }\n }, [willAnimate, shouldRenderFullMedia, speed]);\n\n return {\n shouldRenderThumb,\n shouldRenderFullMedia,\n transitionClassNames,\n };\n};\n","import { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS = 200;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): IDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): IDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_IOS } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName(\n 'AnimatedSticker',\n className,\n // Workaround for an iOS bug when animated stickers sometimes disappear\n IS_IOS && play && 'is-playing',\n );\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT }) => {\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({ children, className, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default Link;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withHandle?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withHandle,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\n loadSuperGroupOnlines,\n openMediaViewer,\n}) => {\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n\n if (isSuperGroup) {\n loadSuperGroupOnlines({ chatId });\n }\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup, loadSuperGroupOnlines]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withHandle ? chat.username : undefined;\n const groupStatus = getGroupStatus(chat, lang);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(chat: ApiChat, lang: LangFn) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'loadSuperGroupOnlines', 'openMediaViewer']),\n)(GroupChatInfo));\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default (\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (!delay || (Date.now() - startedAtRef.current! > delay)) {\n setDownloadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setDownloadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setDownloadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setDownloadProgress(0);\n }\n }, [handleProgress, noLoad]);\n\n return { mediaData, downloadProgress };\n};\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n fastRaf(() => {\n dispatchHeavyAnimationEvent(MAX_JS_DURATION);\n scrollWithJs(container, element, position, margin, forceDuration);\n });\n}\n\nfunction scrollWithJs(\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + containerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < containerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + containerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + containerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport Radio from './Radio';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: number[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [number[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: number;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId = 0,\n direction: LoadMoreDirection,\n listSlice: number,\n) {\n const { length } = sourceIds;\n const index = sourceIds.indexOf(offsetId);\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\n const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow');\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const handleClick = useCallback(() => {\n setPlayKey(String(Math.random()));\n }, []);\n\n let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n
\n );\n};\n\nexport default AnimatedEmoji;\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types';\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH);\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n }\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(/[*]{2}([^*\\n]+)[*]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[*]{1}([^*\\n]+)[*]{1}/g, '$1');\n parsedHtml = parsedHtml.replace(/[~]{2}([^~\\n]+)[~]{2}/g, '$1');\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: number | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = Number((node as HTMLAnchorElement).dataset.userId);\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isChatPrivate } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: number;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","export enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n } else if (e.type === 'touchstart') {\n document.addEventListener('touchmove', onMove);\n document.addEventListener('touchend', onRelease);\n document.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchcancel', onRelease);\n document.removeEventListener('touchend', onRelease);\n document.removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n if (options.onDrag) {\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n }\n\n if (options.onSwipe) {\n processSwipe(e, dragOffsetX, dragOffsetY, options.onSwipe);\n }\n }\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: true });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event, dragOffsetX: number, dragOffsetY: number, onSwipe: (e: Event, direction: SwipeDirection) => void,\n) {\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return;\n }\n }\n\n if (xAbs >= SWIPE_THRESHOLD) {\n if (dragOffsetX < 0) {\n onSwipe(e, SwipeDirection.Left);\n } else {\n onSwipe(e, SwipeDirection.Right);\n }\n } else if (yAbs >= SWIPE_THRESHOLD) {\n if (dragOffsetY < 0) {\n onSwipe(e, SwipeDirection.Up);\n } else {\n onSwipe(e, SwipeDirection.Down);\n }\n }\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nexport default (containerRef: RefObject, isDisabled?: boolean) => {\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [containerRef, isDisabled]);\n};\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: number,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 250;\nconst SELECTION_ANIMATION_DURATION_MS = 200;\n\nlet contextMenuCounter = 0;\n\nfunction checkIsDisabledForMobile() {\n return IS_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n document.body.classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n if (isMenuDisabled) {\n return;\n }\n e.preventDefault();\n document.body.classList.remove('no-selection');\n\n if (contextMenuPosition) {\n return;\n }\n document.body.classList.remove('no-selection');\n if (contextMenuCounter === 0) {\n document.body.classList.add('has-context-menu');\n }\n contextMenuCounter++;\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n\n setTimeout(() => {\n contextMenuCounter--;\n if (contextMenuCounter === 0) {\n document.body.classList.remove('has-context-menu');\n }\n }, SELECTION_ANIMATION_DURATION_MS);\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\n return;\n }\n\n // temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n }, true);\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, elementRef]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n });\n};\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntites = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n canClose?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n canClose,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n return (\n
\n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScroll(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number) {\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollLeft + path;\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / DURATION, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { IS_IOS } from './environment';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {typingStatus.action}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n canDeleteForAll?: boolean;\n chatTitle: string;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n chatTitle,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: true });\n onClose();\n }, [deleteHistory, chat.id, chat.lastMessage, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n chat.isCreator,\n chat.lastMessage,\n chat.id,\n onClose,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n ]);\n\n const lang = useLang();\n\n function renderHeader() {\n return (\n
\n \n

{renderTitle()}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'Leave Channel?';\n }\n\n if (isChannel && chat.isCreator) {\n return 'Delete and Leave Channel?';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Leave Group?';\n }\n\n return 'Delete Chat?';\n }\n\n function renderMessage() {\n if (isChannel && !chat.isCreator) {\n return

Are you sure you want to leave channel {chatTitle}?

;\n }\n if (isChannel && chat.isCreator) {\n return

Are you sure you want to delete and leave channel {chatTitle}?

;\n }\n\n if (isBasicGroup || isSuperGroup) {\n return

Are you sure you want to leave group {chatTitle}?

;\n }\n\n return

Are you sure you want to delete chat with {contactName}?

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'Leave Channel';\n }\n if (isChannel && chat.isCreator) {\n return 'Delete and Leave Channel';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Leave Group';\n }\n\n return `Delete${canDeleteForAll ? ' just for me' : ''}`;\n }\n\n return (\n \n {renderMessage()}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n chatTitle: getChatTitle(chat),\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import React, {\n FC, useCallback, useEffect, useState, memo, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport download from '../../util/download';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const extension = getDocumentExtension(document) || '';\n const { fileName, size, timestamp } = document;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed);\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (isDownloadAllowed && mediaData) {\n download(mediaData, fileName);\n setIsDownloadAllowed(false);\n }\n }, [fileName, mediaData, isDownloadAllowed]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default StickerSetModalAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.toString();\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, []);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, []);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, []);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`;\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY_CODE: Record = {\n KeyK: openLinkControl,\n KeyB: handleBoldText,\n KeyU: handleUnderlineText,\n KeyI: handleItalicText,\n KeyM: handleMonospaceText,\n KeyS: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY_CODE[e.code];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const video = getMessageVideo(message);\n\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageKey,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { renderWaveformToDataUri } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: 'searchResult' | 'sharedMedia';\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n onPlay: (messageId: number, chatId: number) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n};\n\ninterface ISeekMethods {\n handleStartSeek: (e: React.MouseEvent) => void;\n handleSeek: (e: React.MouseEvent) => void;\n handleStopSeek: () => void;\n}\n\nconst AVG_VOICE_DURATION = 30;\nconst MIN_SPIKES = IS_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n renderingFor,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice }, isMediaUnread } = message;\n const isVoice = Boolean(voice);\n const isSeeking = useRef(false);\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldDownload = (isActivated || PRELOAD) && lastSyncTime;\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n );\n\n function handleForcePlay() {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, setCurrentTime, duration,\n } = useAudioPlayer(\n getMessageKey(message),\n getMediaDuration(message)!,\n mediaData,\n bufferingHandlers,\n checkBuffering,\n isActivated,\n handleForcePlay,\n isMessageLocal(message),\n );\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered);\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n setIsActivated(!isActivated);\n playPause();\n }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]);\n\n useEffect(() => {\n if (isPlaying && onReadMedia && isMediaUnread) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia]);\n\n const handleSeek = useCallback((e: React.MouseEvent) => {\n if (isSeeking.current) {\n const seekBar = e.currentTarget.closest('.seekline,.waveform');\n if (seekBar) {\n const { width, left } = seekBar.getBoundingClientRect();\n setCurrentTime(duration * ((e.clientX - left) / width));\n }\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: React.MouseEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useLang();\n\n function getFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function getSecondLine() {\n if (isVoice) {\n return formatMediaDuration(voice!.duration);\n }\n\n const { performer } = audio!;\n\n return (\n <>\n {performer && renderText(performer)}\n {performer && senderTitle && }\n {senderTitle && renderText(senderTitle)}\n \n );\n }\n\n const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek };\n const isOwn = isOwnMessage(message);\n const renderedWaveform = useMemo(\n () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers, theme),\n [voice, playProgress, isOwn, seekHandlers, theme],\n );\n\n const fullClassName = buildClassName(\n 'Audio media-inner',\n className,\n isOwn && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderSpinner) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const contentClassName = buildClassName('content', showSeekline && 'with-seekline');\n\n function renderSearchResult() {\n return (\n <>\n
\n
\n

{renderText(getFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(date * 1000)}\n \n )}\n
\n
\n\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {getSecondLine()}\n

\n )}\n
\n \n );\n }\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n \n \n \n \n {shouldRenderSpinner && (\n
\n \n
\n )}\n {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)}\n
\n );\n};\n\nfunction renderAudio(\n audio: ApiAudio,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekHandlers: ISeekMethods,\n date?: number,\n handleDateClick?: () => void,\n) {\n const {\n title, performer, duration, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n
\n {renderText(performer || 'Unknown')}\n {date && (\n <>\n {' '}\n •\n {' '}\n {formatMediaDateTime(date * 1000)}\n \n )}\n
\n )}\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {formatMediaDuration(duration)}\n

\n
\n );\n}\n\nfunction renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) {\n return (\n
\n {renderedWaveform}\n

\n {formatMediaDuration(voice.duration)}\n {isMediaUnread && }\n

\n
\n );\n}\n\nfunction renderWaveform(\n voice: ApiVoice,\n playProgress = 0,\n isOwn = false,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n theme: ISettings['theme'],\n) {\n const { waveform, duration } = voice;\n\n if (!waveform) {\n return undefined;\n }\n\n const fillColor = theme === 'dark' ? '#494B75' : '#CBCBCB';\n const fillOwnColor = theme === 'dark' ? '#C69C85' : '#B0DEA6';\n const progressFillColor = theme === 'dark' ? '#868DF5' : '#54a3e6';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#53ad53';\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount);\n const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n \n );\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n) {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(Audio));\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveformToDataUri(\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n const canvas = document.createElement('canvas');\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n\n return {\n src: canvas.toDataURL(),\n width,\n height,\n };\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n active?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst Tab: FC = ({\n className,\n title,\n active,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!active || previousActiveTab === undefined) {\n return;\n }\n\n const tab = tabRef.current!;\n const indicator = tab.querySelector('i')!;\n const currentIndicator = tab.parentElement!.children[previousActiveTab].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // 3 AFs needed here to synchronize animations with Transition component\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n });\n }, [active, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {title}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n \n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({ tabs, activeTab, onSwitchTab }) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n if (container.scrollWidth <= container.offsetWidth) {\n return;\n }\n\n const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null;\n if (activeTabElement) {\n const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n
\n {tabs.map((tab, i) => (\n \n ))}\n
\n );\n};\n\nexport default memo(TabList);\n","import { ApiError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n\n // Non-API errors\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.',\n // eslint-disable-next-line max-len\n CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl: string) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\nimport { isChatArchived, getCanDeleteChat, isChatPrivate } from '../modules/helpers';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: boolean;\n}) => {\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const isChatWithSelf = privateChatUser && privateChatUser.isSelf;\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: 'Mark as Read', icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: 'Mark as Unread', icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionPin = isPinned\n ? { title: 'Unpin', icon: 'unpin', handler: () => toggleChatPinned({ id: chat.id, folderId }) }\n : { title: 'Pin', icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n const actionMute = chat.isMuted\n ? { title: 'Unmute', icon: 'unmute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }) }\n : { title: 'Mute', icon: 'mute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }) };\n\n const actionArchive = isChatArchived(chat)\n ? { title: 'Unarchive', icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: 'Archive', icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isChatPrivate(chat.id) ? 'Delete' : (getCanDeleteChat(chat) ? 'Delete and Leave' : 'Leave'),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n return [\n actionUnreadMark,\n actionPin,\n ...(!isChatWithSelf ? [\n actionMute,\n actionArchive,\n ] : []),\n actionDelete,\n ];\n }, [\n chat, privateChatUser, handleDelete, folderId, isPinned,\n toggleChatPinned, updateChatMutedState, toggleChatArchived, toggleChatUnread,\n ]);\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(message.date * 1000)}\n
\n );\n};\n\nexport default LastMessageMeta;\n","import React, { FC } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default MessageOutgoingStatus;\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [style, setStyle] = useState('');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect;\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + extraTopPadding + menuRect.height;\n }\n }\n\n setStyle(`left: ${x - triggerRect.left}px; top: ${y - triggerRect.top}px;`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n };\n};\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { register } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\n\ntype Handler = (e: Event) => void;\n\nexport default (\n trackId: string,\n originalDuration: number, // Sometimes incorrect for voice messages\n src?: string,\n handlers?: Record,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n noPlaylist = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, (eventName, e) => {\n switch (eventName) {\n case 'onPlay':\n setIsPlaying(true);\n break;\n case 'onPause':\n setIsPlaying(false);\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n setPlayProgress(proxy.currentTime / duration);\n break;\n }\n }\n\n if (handlers && handlers[eventName]) {\n handlers[eventName](e);\n }\n }, onForcePlay);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n const {\n play, pause, setCurrentTime, proxy, destroy,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy)) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else if (src) {\n play(src);\n }\n }, [src, pause, play, isPlaying]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n setCurrentTime,\n audioProxy: proxy,\n duration,\n };\n};\n","import { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { parseMessageKey } from '../modules/helpers';\n\ntype Handler = (eventName: string, e: Event) => void;\n\ninterface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet queue: string[] = [];\n\nlet currentTrackId: string | undefined;\n\nfunction createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n const nextTrackId = queue[queue.indexOf(trackId) + 1];\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(nextTrackId));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n });\n\n return {\n audio,\n proxy: new Proxy(audio, {\n get: (origin, key: keyof HTMLAudioElement) => origin[key],\n }),\n handlers: [],\n onForcePlay,\n };\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) {\n if (!tracks.has(trackId)) {\n tracks.set(trackId, createAudio(trackId, onForcePlay));\n\n if (!queue.includes(trackId)) {\n queue.push(trackId);\n }\n }\n\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (currentTrackId && currentTrackId !== trackId) {\n tracks.get(currentTrackId)!.audio.pause();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n audio.currentTime = time;\n }\n },\n\n proxy,\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n queue = queue.filter((id) => id !== trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n onClick,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewData, 'slow');\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && }\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n {' '}\n {formatMediaDateTime(timestamp * 1000)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({ message, duration = DEFAULT_DURATION, onDismiss }) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n
\n \n );\n};\n\nexport default memo(Notification);\n","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport {\n IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\n\ntype OwnProps = {\n id: string;\n editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: number;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_MOBILE_SCREEN ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n onUpdate,\n onSupressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight();\n }\n }, [html]);\n\n const focusInput = useCallback(() => {\n // Avoid focusing during animation\n if (inputRef.current!.closest('.from, .to')) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n !isSelectionInsideInput(selectionRange)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return;\n }\n\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n checkSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n checkSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleTouchSelection() {\n if (!IS_ANDROID) {\n return;\n }\n\n checkSelection();\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!IS_ANDROID) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight() {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n input.style.height = `${Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT)}px`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n focusInput();\n }, [currentChatId, focusInput, replyingToId, shouldSetFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {};\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n currentChatId,\n messageSendKeyCombo,\n replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage']),\n)(MessageInput));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n onMessageClick: (messageId: number, chatId: number) => void;\n};\n\nconst WebLink: FC = ({ message, senderTitle, onMessageClick }) => {\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n {renderText(title || siteName || displayUrl)}\n {truncatedDescription && (\n {renderText(truncatedDescription)}\n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(message.date * 1000)}\n \n
\n )}\n
\n );\n};\n\nexport default memo(WebLink);\n","import { useCallback } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById).map(Number);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: number): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (movesUp(chatId) && numberOfUp <= numberOfDown)\n || (movesDown(chatId) && numberOfDown < numberOfUp)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n chat.isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default Badge;\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n isChatPrivate,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: number;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isSelected,\n isPinned,\n chat,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\n lastSyncTime,\n openChat,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft && draft.text.length) {\n return (\n

\n {lang('Draft')}\n {renderText(draft.text)}\n

\n );\n }\n\n if (!lastMessage) {\n return undefined;\n }\n\n if (isAction) {\n const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId)\n ? chat\n : lastMessageSender;\n\n return (\n

\n {renderText(renderActionMessageText(\n lastMessage,\n actionOrigin,\n actionTargetUser,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

\n );\n }\n\n const senderName = getMessageSenderName(chatId, lastMessageSender);\n\n return (\n

\n {senderName && (\n {renderText(senderName)}\n )}\n {renderMessageSummary(lastMessage!, mediaBlobUrl || mediaThumbnail)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isChatPrivate(chatId) ? 'private' : 'group',\n isSelected && !IS_MOBILE_SCREEN && 'selected',\n );\n\n return (\n \n \n
\n
\n

{renderText(getChatTitle(chat, privateChatUser))}

\n {chat.isVerified && }\n {chat.isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n \n \n );\n};\n\nfunction renderMessageSummary(message: ApiMessage, blobUrl?: string) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport { selectChatFolder, selectCurrentMessageList } from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived'\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n noChatsText = 'Chat list is empty.',\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n loadMoreChats,\n preloadTopChatMessages,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatsById, usersById, chatFolder, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats];\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n // TODO Refactor to not call `prepareChatList` twice\n const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length;\n\n return (\n \n {chatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {chatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n
{noChatsText}
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats', 'preloadTopChatMessages']),\n)(ChatList));\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst UserLink: FC = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageLink: FC = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatLink: FC = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUser?: ApiUser,\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 };\n\n let unprocessed: string;\n let processed = processPlaceholder(\n text,\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUser\n ? renderUserContent(targetUser, options.asPlain)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const showQuotes = text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, options.maxTextLength)!;\n\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = `«${text}»`;\n }\n\n if (options.asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n \n «\n {renderText(messageText)}\n »\n \n );\n }\n\n return (\n {renderText(messageText)}\n );\n}\n\nfunction renderOriginContent(origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return {sender && renderText(text!)};\n}\n\nfunction renderChatContent(chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return {text};\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n content.push(replaceValue);\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { getUserFirstOrLastName } from '../../../../modules/helpers';\nimport searchUserName from '../helpers/searchUserName';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\n\nexport default function useMentionMenu(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionMenuOpen: isOpen,\n mentionFilter: currentFilter,\n closeMentionMenu: unmarkIsOpen,\n insertMention,\n mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\n","import { ApiUser } from '../../../../api/types';\nimport { getUserFullName } from '../../../../modules/helpers';\nimport searchWords from '../../../../util/searchWords';\n\n// TODO: Support cyrillic translit search\nexport default function searchUserName(filter: string, user: ApiUser) {\n const usernameLowered = user.username.toLowerCase();\n const fullName = getUserFullName(user);\n const fullNameLowered = fullName && fullName.toLowerCase();\n const filterLowered = filter.toLowerCase();\n\n return usernameLowered.startsWith(filterLowered) || (\n fullNameLowered && searchWords(fullNameLowered, filterLowered)\n );\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/hooks/useLang.ts","webpack:///./src/components/ui/ListItem.tsx","webpack:///./src/hooks/useIntersectionObserver.ts","webpack:///./src/components/common/PrivateChatInfo.tsx","webpack:///./src/hooks/useMedia.ts","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/Avatar.tsx","webpack:///./src/components/ui/Transition.tsx","webpack:///./src/components/ui/InfiniteScroll.tsx","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/hooks/useTransitionForMedia.ts","webpack:///./src/components/common/helpers/mediaDimensions.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/ConfirmDialog.tsx","webpack:///./src/components/common/NothingFound.tsx","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/hooks/useBuffering.ts","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/components/middle/composer/helpers/parseMessageInput.ts","webpack:///./src/components/middle/composer/DropTarget.tsx","webpack:///./src/components/middle/composer/DropArea.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PickerSelectedItem.tsx","webpack:///./src/util/captureEvents.ts","webpack:///./src/hooks/useHorizontalScroll.ts","webpack:///./src/hooks/useEnsureMessage.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/hooks/useContextMenuHandlers.ts","webpack:///./src/util/cycleRestrict.ts","webpack:///./src/util/safePlay.ts","webpack:///./src/components/common/helpers/renderMessageText.tsx","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useVideoCleanup.ts","webpack:///./src/components/ui/SearchInput.tsx","webpack:///./src/util/fastSmoothScrollHorizontal.ts","webpack:///./src/util/resetScroll.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/common/TypingStatus.tsx","webpack:///./src/components/common/DeleteChatModal.tsx","webpack:///./src/util/patchSafariProgressiveAudio.ts","webpack:///./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack:///./src/components/common/Document.tsx","webpack:///./src/components/common/StickerSetModal.async.tsx","webpack:///./src/components/middle/composer/TextFormatter.tsx","webpack:///./src/components/common/Media.tsx","webpack:///./src/components/common/Audio.tsx","webpack:///./src/util/waveform.ts","webpack:///./src/components/common/helpers/waveform.ts","webpack:///./src/components/ui/Tab.tsx","webpack:///./src/components/ui/TabList.tsx","webpack:///./src/util/getReadableErrorText.ts","webpack:///./src/util/clipboard.ts","webpack:///./src/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","webpack:///./src/hooks/useAudioPlayer.ts","webpack:///./src/util/audioPlayer.ts","webpack:///./src/util/download.ts","webpack:///./src/components/common/File.tsx","webpack:///./src/lib/fastBlur.js","webpack:///./src/components/ui/Notification.tsx","webpack:///./src/components/middle/composer/helpers/selection.ts","webpack:///./src/components/middle/composer/MessageInput.tsx","webpack:///./src/components/common/WebLink.tsx","webpack:///./src/components/left/main/hooks/useChatAnimationType.ts","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/components/middle/composer/hooks/useMentionMenu.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.ts"],"names":["forceUpdate","useForceUpdate","useOnChange","langProvider","ListItem","props","ref","icon","className","style","children","disabled","ripple","narrow","inactive","contextActions","focus","destructive","onClick","containerRef","useRef","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","button","fullClassName","buildClassName","role","tabIndex","undefined","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","isFrozenRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","useEffect","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","Array","from","values","forEach","entry","callback","get","scheduler","throttle","debounce","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","useIsIntersecting","isIntersecting","setIsIntersecting","useState","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withHandle","withFullInfo","withUpdatingStatus","noStatusOrTyping","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","lang","useLang","size","renderText","isVerified","isUserOnline","username","getUserStatus","mediaHash","noLoad","mediaFormat","ApiMediaFormat","BlobUrl","cacheBuster","delay","mediaData","mediaLoader","startedAt","Date","now","then","spentTime","setTimeout","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","chat","text","withOnlineStatus","isDeleted","isDeletedUser","imageHash","getChatAvatarHash","dataUri","useMedia","DataUri","shouldRenderFullMedia","useTransitionForMedia","content","src","alt","decoding","userFullName","getFirstLetters","getChatTitle","isChatPrivate","isOnline","getUserColorKey","senderId","data-test-sender-id","IS_TEST","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","renders","contents","fill","render","InfiniteScroll","onLoadMore","onScroll","items","itemSelector","preloadBackwards","sensitiveArea","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","LoadMoreDirection","Backwards","Forwards","scrollHeight","state","listItemElements","newScrollTop","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","offsetParent","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","teactFastList","cb","dependencies","prevDeps","some","d","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","occupiedHeightRem","matches","calculateInlineImageDimensions","photo","getPhotoInlineDimensions","calculateVideoDimensions","video","getVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","smaller","getStickerDimensions","sticker","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","lottiePromise","RLottie","async","ensureLottie","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","IS_IOS","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","useAsyncRendering","shouldRenderRef","timeoutRef","Link","href","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","loadSuperGroupOnlines","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isStreaming","Stream","IS_PROGRESSIVE_SUPPORTED","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","isSafariPatchInProgress","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","checkBuffering","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","ENTITY_CLASS_BY_NODE_NAME","B","ApiMessageEntityTypes","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","parseMessageInput","html","fragment","parsedHtml","IS_EMOJI_SUPPORTED","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","dataset","entityType","MentionName","startsWith","Email","Phone","textContent","TextUrl","Url","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","push","hasChildNodes","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","onBlur","onFocus","hasFocus","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","SwipeDirection","captureEvents","captureEvent","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","VerifiedIcon","contextMenuCounter","isMenuDisabled","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","cycleRestrict","mediaEl","catch","err","DEBUG","console","warn","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","getMessageText","renderTextWithEntities","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","cache","useBlur","blurredRef","img","Image","onload","canvas","imgToCanvas","fastBlur","getContext","blurredDataUri","toDataURL","useVideoCleanup","videoRef","videoEl","load","inputId","focused","placeholder","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","containerWidth","scrollWidth","animate","scrollTo","overflow","trimText","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","chatTitle","leaveChannel","deleteHistory","deleteChannel","handleDeleteMessageForAll","maxId","lastMessage","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModalAsync","StickerSetModal","useModuleLoader","Bundles","Extra","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","EDITABLE_INPUT_ID","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","onKeyDown","autoComplete","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","isOwnMessage","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","data","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","idx","val","interpolateArray","fillStyle","progressFillStyle","ctx","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","ProgressSpinner","getFirstLine","formatPastTimeShort","performer","getSecondLine","formatMediaDateTime","renderAudio","renderVoice","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","fastSmoothScrollHorizontal","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","getReadableErrorText","error","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","copyImageToClipboard","imageUrl","imageEl","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","LastMessageMeta","outgoingStatus","Keys","MessageOutgoingStatus","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","trackId","originalDuration","handlers","onInit","shouldPlay","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","tracks","currentTrackId","queue","stopCurrentAudio","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","parseMessageKey","nextTrack","safePlay","Proxy","createAudio","preload","IS_SAFARI","time","shouldRemoveFromQueue","track","h","filename","link","click","shouldSpinnerRender","getColorFromExtension","sizeString","getFileSizeString","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","onUpdate","onSupressedFocus","onSend","editLastMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","useLayoutEffectWithPrevDeps","prevHtml","clone","updateInputHeight","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","parseEmojiOnlyString","START_TO_END","selectionRect","inputRect","captureFirstTab","onTab","supressFocus","contentEditable","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","description","handleMessageClick","displayUrl","truncatedDescription","data-initial","ChatAnimationTypes","Badge","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","Opacity","opacity","Move","useChatContextActions","Avatar","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","byId","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","noChatsText","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","mapValues","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","openUserInfo","focusMessage","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","isChat","renderChatContent","renderUserContent","pop","getMessageContent","showQuotes","renderMessageContent","invoice","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","RE_NOT_USERNAME_SEARCH","useMentionMenu","canSuggestMembers","onUpdateHtml","groupChatMembers","currentUserId","markIsOpen","unmarkIsOpen","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","toLowerCase","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","tempEl","lastSymbol","lastWord","test","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","atIndex","lastIndexOf","messageInput","getElementById","isMentionMenuOpen","mentionFilter","closeMentionMenu","mentionFilteredMembers"],"mappings":"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,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,G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","file":"0.fc1c82eed49224140317.js","sourcesContent":["import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ntype OnClickHandler = (e: React.MouseEvent) => void;\n\ntype MenuItemContextAction = {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n};\n\ntype OwnProps = {\n ref?: RefObject;\n icon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n contextActions?: MenuItemContextAction[];\n onClick?: OnClickHandler;\n};\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n contextActions,\n focus,\n destructive,\n onClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const fullClassName = buildClassName(\n 'ListItem no-selection',\n className,\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {children}\n {!disabled && !inactive && ripple && (\n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (isFrozenRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withHandle?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withHandle,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withHandle && user.username && {user.username}}\n {getUserStatus(user, lang)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user && user.isVerified && }\n
\n )}\n {!isSavedMessages && !noStatusOrTyping && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const areMessagesLoaded = Boolean(selectChatMessages(global, userId));\n\n return {\n lastSyncTime, user, isSavedMessages, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash, getChatTitle, isChatPrivate,\n getUserFullName, isUserOnline, isDeletedUser, getUserColorKey,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n withOnlineStatus?: boolean;\n chat?: ApiChat;\n user?: ApiUser;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n text,\n withOnlineStatus,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow');\n\n useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (shouldRenderFullMedia) {\n content = \"\";\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && isUserOnline(user);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, isSavedMessages || shouldRenderFullMedia);\n }\n }, [onClick, isSavedMessages, shouldRenderFullMedia]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'fade' | 'slide-layers'\n | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nconst ANIMATION_DURATION = {\n slide: 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const activateTimeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n childElements[0].classList.add('active');\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\n }\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'none' || animationLevel === 0) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('active');\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\n requestAnimationFrame(() => {\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\n }\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector('.active');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n\n if (onStart) {\n onStart();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector('.active')\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(Transition);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection }) => void;\n onScroll?: (e: UIEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n isDisabled?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n isDisabled = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements: NodeListOf;\n isScrollTopJustUpdated: boolean;\n currentAnchor: HTMLDivElement | undefined;\n currentAnchorTop: number;\n }>({} as any);\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (!items || items.length < preloadBackwards) {\n loadMoreBackwards();\n } else {\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n if (isDisabled) {\n return;\n }\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor && nextAnchor.offsetParent) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [isDisabled, itemSelector, items, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n
\n {children}\n
\n );\n};\n\nexport default InfiniteScroll;\n","import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","import { useEffect, useRef, useState } from '../lib/teact/teact';\n\nimport useShowTransition from './useShowTransition';\n\nconst SPEED = {\n fast: 200,\n slow: 350,\n};\n\nexport default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => {\n const isMediaLoaded = Boolean(mediaData);\n const willAnimate = !useRef(isMediaLoaded).current && !noAnimate;\n const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded);\n\n const {\n shouldRender: shouldRenderFullMedia,\n transitionClassNames,\n } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed);\n\n useEffect(() => {\n if (shouldRenderFullMedia) {\n if (willAnimate) {\n setTimeout(() => {\n setShouldRenderThumb(false);\n }, SPEED[speed]);\n } else {\n setShouldRenderThumb(false);\n }\n }\n }, [willAnimate, shouldRenderFullMedia, speed]);\n\n return {\n shouldRenderThumb,\n shouldRenderFullMedia,\n transitionClassNames,\n };\n};\n","import { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS = 200;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): IDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): IDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_IOS } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName(\n 'AnimatedSticker',\n className,\n // Workaround for an iOS bug when animated stickers sometimes disappear\n IS_IOS && play && 'is-playing',\n );\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT }) => {\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({ children, className, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default Link;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withHandle?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withHandle,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\n loadSuperGroupOnlines,\n openMediaViewer,\n}) => {\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n\n if (isSuperGroup) {\n loadSuperGroupOnlines({ chatId });\n }\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup, loadSuperGroupOnlines]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withHandle ? chat.username : undefined;\n const groupStatus = getGroupStatus(chat, lang);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(chat: ApiChat, lang: LangFn) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'loadSuperGroupOnlines', 'openMediaViewer']),\n)(GroupChatInfo));\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default (\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (!delay || (Date.now() - startedAtRef.current! > delay)) {\n setDownloadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setDownloadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setDownloadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setDownloadProgress(0);\n }\n }, [handleProgress, noLoad]);\n\n return { mediaData, downloadProgress };\n};\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n fastRaf(() => {\n dispatchHeavyAnimationEvent(MAX_JS_DURATION);\n scrollWithJs(container, element, position, margin, forceDuration);\n });\n}\n\nfunction scrollWithJs(\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + containerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < containerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + containerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + containerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport Radio from './Radio';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: number[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [number[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: number;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId = 0,\n direction: LoadMoreDirection,\n listSlice: number,\n) {\n const { length } = sourceIds;\n const index = sourceIds.indexOf(offsetId);\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\n const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow');\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const handleClick = useCallback(() => {\n setPlayKey(String(Math.random()));\n }, []);\n\n let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n \n );\n};\n\nexport default AnimatedEmoji;\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types';\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH);\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n }\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(/[*]{2}([^*\\n]+)[*]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[*]{1}([^*\\n]+)[*]{1}/g, '$1');\n parsedHtml = parsedHtml.replace(/[~]{2}([^~\\n]+)[~]{2}/g, '$1');\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: number | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = Number((node as HTMLAnchorElement).dataset.userId);\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isChatPrivate } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: number;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","export enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n } else if (e.type === 'touchstart') {\n document.addEventListener('touchmove', onMove);\n document.addEventListener('touchend', onRelease);\n document.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchcancel', onRelease);\n document.removeEventListener('touchend', onRelease);\n document.removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n if (options.onDrag) {\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n }\n\n if (options.onSwipe) {\n processSwipe(e, dragOffsetX, dragOffsetY, options.onSwipe);\n }\n }\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: true });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event, dragOffsetX: number, dragOffsetY: number, onSwipe: (e: Event, direction: SwipeDirection) => void,\n) {\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return;\n }\n }\n\n if (xAbs >= SWIPE_THRESHOLD) {\n if (dragOffsetX < 0) {\n onSwipe(e, SwipeDirection.Left);\n } else {\n onSwipe(e, SwipeDirection.Right);\n }\n } else if (yAbs >= SWIPE_THRESHOLD) {\n if (dragOffsetY < 0) {\n onSwipe(e, SwipeDirection.Up);\n } else {\n onSwipe(e, SwipeDirection.Down);\n }\n }\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nexport default (containerRef: RefObject, isDisabled?: boolean) => {\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [containerRef, isDisabled]);\n};\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: number,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 250;\nconst SELECTION_ANIMATION_DURATION_MS = 200;\n\nlet contextMenuCounter = 0;\n\nfunction checkIsDisabledForMobile() {\n return IS_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n document.body.classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n if (isMenuDisabled) {\n return;\n }\n e.preventDefault();\n document.body.classList.remove('no-selection');\n\n if (contextMenuPosition) {\n return;\n }\n document.body.classList.remove('no-selection');\n if (contextMenuCounter === 0) {\n document.body.classList.add('has-context-menu');\n }\n contextMenuCounter++;\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n\n setTimeout(() => {\n contextMenuCounter--;\n if (contextMenuCounter === 0) {\n document.body.classList.remove('has-context-menu');\n }\n }, SELECTION_ANIMATION_DURATION_MS);\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\n return;\n }\n\n // temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n }, true);\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, elementRef]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n });\n};\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntites = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n canClose?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n canClose,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n return (\n
\n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScroll(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number) {\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollLeft + path;\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / DURATION, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { IS_IOS } from './environment';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {typingStatus.action}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n canDeleteForAll?: boolean;\n chatTitle: string;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n chatTitle,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: true });\n onClose();\n }, [deleteHistory, chat.id, chat.lastMessage, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n chat.isCreator,\n chat.lastMessage,\n chat.id,\n onClose,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n ]);\n\n const lang = useLang();\n\n function renderHeader() {\n return (\n
\n \n

{renderTitle()}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'Leave Channel?';\n }\n\n if (isChannel && chat.isCreator) {\n return 'Delete and Leave Channel?';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Leave Group?';\n }\n\n return 'Delete Chat?';\n }\n\n function renderMessage() {\n if (isChannel && !chat.isCreator) {\n return

Are you sure you want to leave channel {chatTitle}?

;\n }\n if (isChannel && chat.isCreator) {\n return

Are you sure you want to delete and leave channel {chatTitle}?

;\n }\n\n if (isBasicGroup || isSuperGroup) {\n return

Are you sure you want to leave group {chatTitle}?

;\n }\n\n return

Are you sure you want to delete chat with {contactName}?

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'Leave Channel';\n }\n if (isChannel && chat.isCreator) {\n return 'Delete and Leave Channel';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Leave Group';\n }\n\n return `Delete${canDeleteForAll ? ' just for me' : ''}`;\n }\n\n return (\n \n {renderMessage()}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n chatTitle: getChatTitle(chat),\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import React, {\n FC, useCallback, useEffect, useState, memo, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport download from '../../util/download';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const extension = getDocumentExtension(document) || '';\n const { fileName, size, timestamp } = document;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed);\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (isDownloadAllowed && mediaData) {\n download(mediaData, fileName);\n setIsDownloadAllowed(false);\n }\n }, [fileName, mediaData, isDownloadAllowed]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default StickerSetModalAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.toString();\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, []);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, []);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, []);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`;\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY_CODE: Record = {\n KeyK: openLinkControl,\n KeyB: handleBoldText,\n KeyU: handleUnderlineText,\n KeyI: handleItalicText,\n KeyM: handleMonospaceText,\n KeyS: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY_CODE[e.code];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const video = getMessageVideo(message);\n\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageKey,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { renderWaveformToDataUri } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: 'searchResult' | 'sharedMedia';\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n onPlay: (messageId: number, chatId: number) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n};\n\ninterface ISeekMethods {\n handleStartSeek: (e: React.MouseEvent) => void;\n handleSeek: (e: React.MouseEvent) => void;\n handleStopSeek: () => void;\n}\n\nconst AVG_VOICE_DURATION = 30;\nconst MIN_SPIKES = IS_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n renderingFor,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice }, isMediaUnread } = message;\n const isVoice = Boolean(voice);\n const isSeeking = useRef(false);\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldDownload = (isActivated || PRELOAD) && lastSyncTime;\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n );\n\n function handleForcePlay() {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, setCurrentTime, duration,\n } = useAudioPlayer(\n getMessageKey(message),\n getMediaDuration(message)!,\n mediaData,\n bufferingHandlers,\n checkBuffering,\n isActivated,\n handleForcePlay,\n isMessageLocal(message),\n );\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered);\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n setIsActivated(!isActivated);\n playPause();\n }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]);\n\n useEffect(() => {\n if (isPlaying && onReadMedia && isMediaUnread) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia]);\n\n const handleSeek = useCallback((e: React.MouseEvent) => {\n if (isSeeking.current) {\n const seekBar = e.currentTarget.closest('.seekline,.waveform');\n if (seekBar) {\n const { width, left } = seekBar.getBoundingClientRect();\n setCurrentTime(duration * ((e.clientX - left) / width));\n }\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: React.MouseEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useLang();\n\n function getFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function getSecondLine() {\n if (isVoice) {\n return formatMediaDuration(voice!.duration);\n }\n\n const { performer } = audio!;\n\n return (\n <>\n {performer && renderText(performer)}\n {performer && senderTitle && }\n {senderTitle && renderText(senderTitle)}\n \n );\n }\n\n const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek };\n const isOwn = isOwnMessage(message);\n const renderedWaveform = useMemo(\n () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers, theme),\n [voice, playProgress, isOwn, seekHandlers, theme],\n );\n\n const fullClassName = buildClassName(\n 'Audio media-inner',\n className,\n isOwn && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderSpinner) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const contentClassName = buildClassName('content', showSeekline && 'with-seekline');\n\n function renderSearchResult() {\n return (\n <>\n
\n
\n

{renderText(getFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(date * 1000)}\n \n )}\n
\n
\n\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {getSecondLine()}\n

\n )}\n
\n \n );\n }\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n \n \n \n \n {shouldRenderSpinner && (\n
\n \n
\n )}\n {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)}\n
\n );\n};\n\nfunction renderAudio(\n audio: ApiAudio,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekHandlers: ISeekMethods,\n date?: number,\n handleDateClick?: () => void,\n) {\n const {\n title, performer, duration, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n
\n {renderText(performer || 'Unknown')}\n {date && (\n <>\n {' '}\n •\n {' '}\n {formatMediaDateTime(date * 1000)}\n \n )}\n
\n )}\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {formatMediaDuration(duration)}\n

\n
\n );\n}\n\nfunction renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) {\n return (\n
\n {renderedWaveform}\n

\n {formatMediaDuration(voice.duration)}\n {isMediaUnread && }\n

\n
\n );\n}\n\nfunction renderWaveform(\n voice: ApiVoice,\n playProgress = 0,\n isOwn = false,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n theme: ISettings['theme'],\n) {\n const { waveform, duration } = voice;\n\n if (!waveform) {\n return undefined;\n }\n\n const fillColor = theme === 'dark' ? '#494B75' : '#CBCBCB';\n const fillOwnColor = theme === 'dark' ? '#C69C85' : '#B0DEA6';\n const progressFillColor = theme === 'dark' ? '#868DF5' : '#54a3e6';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#53ad53';\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount);\n const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n \n );\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n) {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(Audio));\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveformToDataUri(\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n const canvas = document.createElement('canvas');\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n\n return {\n src: canvas.toDataURL(),\n width,\n height,\n };\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n active?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst Tab: FC = ({\n className,\n title,\n active,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!active || previousActiveTab === undefined) {\n return;\n }\n\n const tab = tabRef.current!;\n const indicator = tab.querySelector('i')!;\n const currentIndicator = tab.parentElement!.children[previousActiveTab].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // 3 AFs needed here to synchronize animations with Transition component\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n });\n }, [active, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {title}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n \n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({ tabs, activeTab, onSwitchTab }) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n if (container.scrollWidth <= container.offsetWidth) {\n return;\n }\n\n const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null;\n if (activeTabElement) {\n const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n
\n {tabs.map((tab, i) => (\n \n ))}\n
\n );\n};\n\nexport default memo(TabList);\n","import { ApiError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n\n // Non-API errors\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.',\n // eslint-disable-next-line max-len\n CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl: string) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\nimport { isChatArchived, getCanDeleteChat, isChatPrivate } from '../modules/helpers';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: boolean;\n}) => {\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const isChatWithSelf = privateChatUser && privateChatUser.isSelf;\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: 'Mark as Read', icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: 'Mark as Unread', icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionPin = isPinned\n ? { title: 'Unpin', icon: 'unpin', handler: () => toggleChatPinned({ id: chat.id, folderId }) }\n : { title: 'Pin', icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n const actionMute = chat.isMuted\n ? { title: 'Unmute', icon: 'unmute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }) }\n : { title: 'Mute', icon: 'mute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }) };\n\n const actionArchive = isChatArchived(chat)\n ? { title: 'Unarchive', icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: 'Archive', icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isChatPrivate(chat.id) ? 'Delete' : (getCanDeleteChat(chat) ? 'Delete and Leave' : 'Leave'),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n return [\n actionUnreadMark,\n actionPin,\n ...(!isChatWithSelf ? [\n actionMute,\n actionArchive,\n ] : []),\n actionDelete,\n ];\n }, [\n chat, privateChatUser, handleDelete, folderId, isPinned,\n toggleChatPinned, updateChatMutedState, toggleChatArchived, toggleChatUnread,\n ]);\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(message.date * 1000)}\n
\n );\n};\n\nexport default LastMessageMeta;\n","import React, { FC } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default MessageOutgoingStatus;\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [style, setStyle] = useState('');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect;\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + extraTopPadding + menuRect.height;\n }\n }\n\n setStyle(`left: ${x - triggerRect.left}px; top: ${y - triggerRect.top}px;`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n };\n};\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { register } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\n\ntype Handler = (e: Event) => void;\n\nexport default (\n trackId: string,\n originalDuration: number, // Sometimes incorrect for voice messages\n src?: string,\n handlers?: Record,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n noPlaylist = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, (eventName, e) => {\n switch (eventName) {\n case 'onPlay':\n setIsPlaying(true);\n break;\n case 'onPause':\n setIsPlaying(false);\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n setPlayProgress(proxy.currentTime / duration);\n break;\n }\n }\n\n if (handlers && handlers[eventName]) {\n handlers[eventName](e);\n }\n }, onForcePlay);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n const {\n play, pause, setCurrentTime, proxy, destroy,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy)) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else if (src) {\n play(src);\n }\n }, [src, pause, play, isPlaying]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n setCurrentTime,\n audioProxy: proxy,\n duration,\n };\n};\n","import { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { parseMessageKey } from '../modules/helpers';\n\ntype Handler = (eventName: string, e: Event) => void;\n\ninterface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet queue: string[] = [];\n\nlet currentTrackId: string | undefined;\n\nfunction createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n const nextTrackId = queue[queue.indexOf(trackId) + 1];\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(nextTrackId));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n });\n\n return {\n audio,\n proxy: new Proxy(audio, {\n get: (origin, key: keyof HTMLAudioElement) => origin[key],\n }),\n handlers: [],\n onForcePlay,\n };\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) {\n if (!tracks.has(trackId)) {\n tracks.set(trackId, createAudio(trackId, onForcePlay));\n\n if (!queue.includes(trackId)) {\n queue.push(trackId);\n }\n }\n\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (currentTrackId && currentTrackId !== trackId) {\n tracks.get(currentTrackId)!.audio.pause();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n audio.currentTime = time;\n }\n },\n\n proxy,\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n queue = queue.filter((id) => id !== trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n onClick,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewData, 'slow');\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && }\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n {' '}\n {formatMediaDateTime(timestamp * 1000)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({ message, duration = DEFAULT_DURATION, onDismiss }) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n
\n \n );\n};\n\nexport default memo(Notification);\n","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport {\n IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\n\ntype OwnProps = {\n id: string;\n editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: number;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_MOBILE_SCREEN ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n onUpdate,\n onSupressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight();\n }\n }, [html]);\n\n const focusInput = useCallback(() => {\n // Avoid focusing during animation\n if (inputRef.current!.closest('.from, .to')) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n !isSelectionInsideInput(selectionRange)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return;\n }\n\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n checkSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n checkSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleTouchSelection() {\n if (!IS_ANDROID) {\n return;\n }\n\n checkSelection();\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!IS_ANDROID) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight() {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n input.style.height = `${Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT)}px`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n focusInput();\n }, [currentChatId, focusInput, replyingToId, shouldSetFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {};\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n currentChatId,\n messageSendKeyCombo,\n replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage']),\n)(MessageInput));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n onMessageClick: (messageId: number, chatId: number) => void;\n};\n\nconst WebLink: FC = ({ message, senderTitle, onMessageClick }) => {\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n {renderText(title || siteName || displayUrl)}\n {truncatedDescription && (\n {renderText(truncatedDescription)}\n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(message.date * 1000)}\n \n
\n )}\n
\n );\n};\n\nexport default memo(WebLink);\n","import { useCallback } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById).map(Number);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: number): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (movesUp(chatId) && numberOfUp <= numberOfDown)\n || (movesDown(chatId) && numberOfDown < numberOfUp)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n chat.isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default Badge;\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n isChatPrivate,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: number;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isSelected,\n isPinned,\n chat,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\n lastSyncTime,\n openChat,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft && draft.text.length) {\n return (\n

\n {lang('Draft')}\n {renderText(draft.text)}\n

\n );\n }\n\n if (!lastMessage) {\n return undefined;\n }\n\n if (isAction) {\n const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId)\n ? chat\n : lastMessageSender;\n\n return (\n

\n {renderText(renderActionMessageText(\n lastMessage,\n actionOrigin,\n actionTargetUser,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

\n );\n }\n\n const senderName = getMessageSenderName(chatId, lastMessageSender);\n\n return (\n

\n {senderName && (\n {renderText(senderName)}\n )}\n {renderMessageSummary(lastMessage!, mediaBlobUrl || mediaThumbnail)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isChatPrivate(chatId) ? 'private' : 'group',\n isSelected && !IS_MOBILE_SCREEN && 'selected',\n );\n\n return (\n \n \n
\n
\n

{renderText(getChatTitle(chat, privateChatUser))}

\n {chat.isVerified && }\n {chat.isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n \n \n );\n};\n\nfunction renderMessageSummary(message: ApiMessage, blobUrl?: string) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport { selectChatFolder, selectCurrentMessageList } from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived'\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n noChatsText = 'Chat list is empty.',\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n loadMoreChats,\n preloadTopChatMessages,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatsById, usersById, chatFolder, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats];\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n // TODO Refactor to not call `prepareChatList` twice\n const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length;\n\n return (\n \n {chatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {chatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n
{noChatsText}
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats', 'preloadTopChatMessages']),\n)(ChatList));\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst UserLink: FC = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageLink: FC = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatLink: FC = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUser?: ApiUser,\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 };\n\n let unprocessed: string;\n let processed = processPlaceholder(\n text,\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUser\n ? renderUserContent(targetUser, options.asPlain)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const showQuotes = text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, options.maxTextLength)!;\n\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = `«${text}»`;\n }\n\n if (options.asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n \n «\n {renderText(messageText)}\n »\n \n );\n }\n\n return (\n {renderText(messageText)}\n );\n}\n\nfunction renderOriginContent(origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return {sender && renderText(text!)};\n}\n\nfunction renderChatContent(chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return {text};\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n content.push(replaceValue);\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { getUserFirstOrLastName } from '../../../../modules/helpers';\nimport searchUserName from '../helpers/searchUserName';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\n\nexport default function useMentionMenu(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionMenuOpen: isOpen,\n mentionFilter: currentFilter,\n closeMentionMenu: unmarkIsOpen,\n insertMention,\n mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\n","import { ApiUser } from '../../../../api/types';\nimport { getUserFullName } from '../../../../modules/helpers';\nimport searchWords from '../../../../util/searchWords';\n\n// TODO: Support cyrillic translit search\nexport default function searchUserName(filter: string, user: ApiUser) {\n const usernameLowered = user.username.toLowerCase();\n const fullName = getUserFullName(user);\n const fullNameLowered = fullName && fullName.toLowerCase();\n const filterLowered = filter.toLowerCase();\n\n return usernameLowered.startsWith(filterLowered) || (\n fullNameLowered && searchWords(fullNameLowered, filterLowered)\n );\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/10.5c1fcaa030b8e2a15227.js b/dist/10.bd5435d947f7c8aea0ee.js similarity index 98% rename from dist/10.5c1fcaa030b8e2a15227.js rename to dist/10.bd5435d947f7c8aea0ee.js index 280862c61..2e9aff3c7 100644 --- a/dist/10.5c1fcaa030b8e2a15227.js +++ b/dist/10.bd5435d947f7c8aea0ee.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{304:function(e,t,o){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{"flushed"===o.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.sourceNode=e[0],this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{"done"===i.data.message&&(e.removeEventListener("message",o),t())};e.addEventListener("message",o),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])}}]); -//# sourceMappingURL=10.5c1fcaa030b8e2a15227.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{305:function(e,t,o){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{"flushed"===o.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.sourceNode=e[0],this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{"done"===i.data.message&&(e.removeEventListener("message",o),t())};e.addEventListener("message",o),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])}}]); +//# sourceMappingURL=10.bd5435d947f7c8aea0ee.js.map \ No newline at end of file diff --git a/dist/10.5c1fcaa030b8e2a15227.js.map b/dist/10.bd5435d947f7c8aea0ee.js.map similarity index 99% rename from dist/10.5c1fcaa030b8e2a15227.js.map rename to dist/10.bd5435d947f7c8aea0ee.js.map index f3f6efdb7..9351fff42 100644 --- a/dist/10.5c1fcaa030b8e2a15227.js.map +++ b/dist/10.bd5435d947f7c8aea0ee.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/opus-recorder/dist/recorder.min.js"],"names":["self","module","exports","e","t","o","i","n","l","call","m","c","d","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","AudioContext","webkitAudioContext","isRecordingSupported","Error","this","state","config","assign","bufferLength","encoderApplication","encoderFrameSize","encoderPath","encoderSampleRate","maxFramesPerPage","mediaTrackConstraints","monitorGain","numberOfChannels","recordingGain","resampleQuality","streamPages","reuseWorker","wavBitDepth","encodedSamplePosition","navigator","mediaDevices","getUserMedia","WebAssembly","clearStream","stream","getTracks","forEach","stop","audioContext","closeAudioContext","close","encodeBuffers","getChannelData","encoder","postMessage","command","buffers","initAudioContext","context","initAudioGraph","scriptProcessorNode","createScriptProcessor","connect","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","Promise","resolve","audio","then","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","totalLength","data","message","samplePosition","page","removeEventListener","finish","addEventListener","originalSampleRate","sampleRate","wavSampleRate","pause","onpause","resume","onresume","gain","setTargetAtTime","currentTime","start","all","sourceNode","onstart","disconnect","destroyWorker","push","length","ondataavailable","Uint8Array","reduce","set","onstop","Function","window"],"mappings":"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","file":"10.5c1fcaa030b8e2a15227.js","sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.sourceNode=e[0],this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./node_modules/opus-recorder/dist/recorder.min.js"],"names":["self","module","exports","e","t","o","i","n","l","call","m","c","d","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","AudioContext","webkitAudioContext","isRecordingSupported","Error","this","state","config","assign","bufferLength","encoderApplication","encoderFrameSize","encoderPath","encoderSampleRate","maxFramesPerPage","mediaTrackConstraints","monitorGain","numberOfChannels","recordingGain","resampleQuality","streamPages","reuseWorker","wavBitDepth","encodedSamplePosition","navigator","mediaDevices","getUserMedia","WebAssembly","clearStream","stream","getTracks","forEach","stop","audioContext","closeAudioContext","close","encodeBuffers","getChannelData","encoder","postMessage","command","buffers","initAudioContext","context","initAudioGraph","scriptProcessorNode","createScriptProcessor","connect","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","Promise","resolve","audio","then","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","totalLength","data","message","samplePosition","page","removeEventListener","finish","addEventListener","originalSampleRate","sampleRate","wavSampleRate","pause","onpause","resume","onresume","gain","setTargetAtTime","currentTime","start","all","sourceNode","onstart","disconnect","destroyWorker","push","length","ondataavailable","Uint8Array","reduce","set","onstop","Function","window"],"mappings":"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","file":"10.bd5435d947f7c8aea0ee.js","sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.sourceNode=e[0],this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/2.e4ac6d760c71882d981f.js b/dist/2.e4ac6d760c71882d981f.js deleted file mode 100644 index 443836fb5..000000000 --- a/dist/2.e4ac6d760c71882d981f.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],Array(90).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return he})),a.d(t,"ForwardPicker",(function(){return ye})),a.d(t,"Errors",(function(){return Ie})),a.d(t,"Notifications",(function(){return we})),a.d(t,"CalendarModal",(function(){return Le})),a.d(t,"DeleteMessageModal",(function(){return Ae})),a.d(t,"PinMessageModal",(function(){return Te})),a.d(t,"UnpinAllMessagesModal",(function(){return De})),a.d(t,"MessageSelectToolbar",(function(){return Re})),a.d(t,"LeftSearch",(function(){return kt})),a.d(t,"Settings",(function(){return sn})),a.d(t,"ContactList",(function(){return on})),a.d(t,"NewChat",(function(){return bn})),a.d(t,"NewChatStep1",(function(){return dn})),a.d(t,"NewChatStep2",(function(){return un})),a.d(t,"ArchivedChats",(function(){return gn})),a.d(t,"ContextMenuContainer",(function(){return wn})),a.d(t,"StickerSetModal",(function(){return Pn})),a.d(t,"HeaderMenuContainer",(function(){return Fn})),a.d(t,"MobileSearch",(function(){return Tn})),a.d(t,"AttachmentModal",(function(){return $n})),a.d(t,"PollModal",(function(){return Vn})),a.d(t,"SymbolMenu",(function(){return gc})),a.d(t,"AttachMenu",(function(){return vc})),a.d(t,"MentionMenu",(function(){return zn})),a.d(t,"EmojiTooltip",(function(){return Ec})),a.d(t,"BotKeyboardMenu",(function(){return fc})),a.d(t,"CustomSendMenu",(function(){return Oc})),a.d(t,"DropArea",(function(){return jc.b})),a.d(t,"TextFormatter",(function(){return Cc.a})),a.d(t,"RightSearch",(function(){return kc})),a.d(t,"StickerSearch",(function(){return Sc})),a.d(t,"GifSearch",(function(){return wc})),a.d(t,"Statistics",(function(){return Ac})),a.d(t,"PollResults",(function(){return Dc})),a.d(t,"Management",(function(){return Qc})),a.d(t,"PaymentModal",(function(){return jr})),a.d(t,"ReceiptModal",(function(){return kr}));var n=a(0),c=a(2),r=a(5),s=a(18),l=a(1),o=a(7),i=a(104),m=a(6),d=a(4),u=a(3),h=a(128),b=a(42),p=a(166),g=a(29),v=a(97),E=a(112),f=a(169),O=a(102),j=a(136),C=a(14);var y=a(37),k=a(43),N=a(135),I=a(49);function S(e,t,a,n){const{mediaEl:c}=L(t,n);if(!c)return;const{width:r}=I.a.get();let o,m=!1;if(n){const{photo:e,video:t,webPage:a}=Object(d.v)(n);m=Boolean(t),o=t?Object(d.bb)(t):Object(d.R)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,m),{width:b,height:p}=Object(i.e)(u,h,o.width,o.height),g=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-p)/2;let{top:E,left:f,width:O,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,p,E,f,O,j);E=e.top,f=e.left,O=e.width,j=e.height}const C=f+O/2-(g+b/2),y=E+j/2-(v+p/2),k=O/b,N=j/p,S=P(a||c);F(S,{top:v+"px",left:g+"px",width:b+"px",height:p+"px",transform:`translate3d(${C}px, ${y}px, 0) scale(${k}, ${N})`}),A(S,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(S),requestAnimationFrame(()=>{S.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(S),setTimeout(()=>{requestAnimationFrame(()=>{document.body.removeChild(S),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function w(e,t,a){const{container:n,mediaEl:c}=L(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:m,height:d}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:p}=c.getBoundingClientRect();let g=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=I.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=I.a.get();g=uO?f=O:O>f&&(O=f));const C=P(t||c);F(C,{top:g+"px",left:h+"px",width:b+"px",height:p+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${f}, ${O})`}),requestAnimationFrame(()=>{document.body.classList.add("ghost-animating"),document.body.appendChild(C),requestAnimationFrame(()=>{C.style.transform="",j&&(C.style.opacity="0"),A(C,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.removeChild(C),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function P(e){const t=document.createElement("div");t.classList.add("ghost");const a=new Image;return"string"==typeof e?a.src=e:e instanceof HTMLVideoElement?a.src=e.poster:a.src=e.src,t.appendChild(a),t}function M(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(d.lb)(t)?Object(m.Db)(e,t):Object(m.f)(e,t)};if(!a||!t)return{};const c=Object(m.k)(e,t,a);return{message:c,sender:c&&Object(m.qb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]);if(Object(T.a)(),!a||!r&&!c)return;const i=a.id<0,m=Object(d.U)(a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},i?n.a.createElement(q.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(q.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title"},m&&Object(G.a)(m)),n.a.createElement("div",{className:"date"},c?"Profile photo":Object(R.d)(1e3*r.date))))}),$=a(167),H=a(56),V=a(32),W=a(113);a(240);var Y=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:m})=>{const[u,h]=Object(n.r)(!1),b=t&&c?Object(d.D)(c,"download"):void 0,{mediaData:p,downloadProgress:g}=Object(E.a)(b,!u);Object(n.n)(()=>{u&&p&&(Object($.a)(p,r),h(!1))},[r,p,u]),Object(n.n)(()=>{h(!1)},[b]);const v=Object(n.m)(e=>{e.stopPropagation(),h(e=>!e)},[]),f=Object(T.a)(),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return o.f?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(H.a,{trigger:O,positionX:"right"},!s&&n.a.createElement(V.a,{icon:"forward",onClick:i},f("Forward")),t?n.a.createElement(V.a,{icon:u?"close":"download",onClick:v},u?Math.round(100*g)+"% Downloading...":"Download"):n.a.createElement(V.a,{icon:"download",href:e,download:r},f("AccActionDownload"))),u&&n.a.createElement(W.a,{progress:g,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("AccActionDownload"),onClick:v},u?n.a.createElement(W.a,{progress:g,size:"s",onClick:v}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(U.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:m},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},K=a(9);a(241);var Z=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(K.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":"")},e)))},Q=a(27),_=a(121);const X=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var J=a(137),ee=a(134);const te=["bytes","kB","MB","GB","TB","PB"];var ae=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${te[t]}`};a(242);const ne=e=>{e.stopPropagation()};var ce=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:m,onChangeFullscreen:d,onPlayPause:u,onSeek:h})=>{const[b,p]=Object(n.r)(!0);Object(n.n)(()=>{r&&p(r)},[r]),Object(n.n)(()=>{let e;return r||(o.f?p(!1):e=window.setTimeout(()=>{p(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const g=Object(T.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ne},function(e,t,a,c){const r=e/t*100,s=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(U.a,{ariaLabel:g("AccActionPlay"),size:"tiny",ripple:!o.f,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(R.e)(e)} / ${Object(R.e)(t)}`)}(t,a),e<1&&(v=e,E=c,n.a.createElement("div",{className:"player-file-size"},`${ae(E*v)} / ${ae(E)}`)),i&&n.a.createElement(U.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:d},n.a.createElement("i",{className:""+(m?"icon-smallscreen":"icon-fullscreen")})))};a(243);function re(){return(re=Object.assign||function(e){for(var t=1;t{const d=Object(n.q)(null),[u,h]=Object(n.r)(!o.k||!o.d),[b,p]=Object(n.r)(0),[g,v]=Object(n.r)(!0),[E,f,O]=function(e,t){const[a,c]=Object(n.r)(Boolean(X&&document[X]));return Object(n.o)(()=>{const a=()=>{c(Boolean(X&&document[X]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),X||"iOS"===o.n?[a,()=>{e.current&&(X||"iOS"===o.n)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),c(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),c(!1))}]:[!1]}(d,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(_.a)(),{shouldRender:k,transitionClassNames:N}=Object(Q.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?d.current.pause():e&&!o.k&&Object(ee.a)(d.current)},[i,l,e]),Object(n.n)(()=>{d.current.currentTime===d.current.duration?(p(0),h(!1)):p(d.current.currentTime)},[b]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(d.current.pause(),h(!1)):(d.current.play(),h(!0))},[u]);Object(J.a)(d,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{p(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{p(0),h(!1)},[]),F=Object(n.m)(()=>{E&&O?O():!E&&f&&f()},[O,E,f]),L=Object(n.m)(e=>{e.stopPropagation(),d.current.currentTime=Number(e.target.value)*d.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!g)},[g]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,D=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.f?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",re({ref:d,autoPlay:o.k,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:D,onEnded:M},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(W.a,{size:"xl",progress:j?1:r,square:!0,onClick:m})),!t&&!k&&n.a.createElement(ce,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(f),isFullscreen:E,fileSize:s,duration:d.current?d.current.duration:0,isForceVisible:!u||g,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),le=a(8);a(244);var oe=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(Q.a)(e),c=Object(y.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const m=Object(n.m)(()=>{i.current=!0},[]),d=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(T.a)(),h=Object(le.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(U.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.f,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(U.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.f,onClick:()=>{r.current&&l(Math.min(3,s+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:m,onMouseUp:d}))))});a(245);const ie=[1,0,0,1,0,0],me={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var de=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=me[r]||r,[m,d]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[p,g]=Object(n.r)(ie),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||p[0],t=s||p[4],a=l||p[5],n=[...p];p[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),p[4]!==t&&(n[4]=t),p[5]!==a&&(n[5]=a),Object(u.a)(p,n)||g(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||g(ie)},[c]),Object(n.n)(()=>{E.current&&(E.current.style.transform=`matrix(${p.toString()})`)},[a,p]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!c)return;e.stopPropagation(),e.preventDefault();const t={dx:p[4],dy:p[5],x:e.pageX,y:e.pageY};b(t),d(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{d(!1),v.current&&v.current.classList.remove("move"),o&&o(p[4],p[5])},onMouseMove:e=>{if(m){const t=function(e,t){const a=[...p],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);g(t),E.current&&(E.current.style.transform=`matrix(${p.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(246);function ue(e,t){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:!1}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(D.a,{color:"white"}))}var he=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,origin:r}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(r===s.h.SearchResult){if(!t||!n)return{animationLevel:l};const a=Object(m.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:r,message:a,animationLevel:l}:{animationLevel:l}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(m.f)(e,c)||Object(m.Db)(e,c),animationLevel:l,origin:r}}if(!(t&&a&&n))return{animationLevel:l};let o,i,d;if(o=r&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(r)?Object(m.mb)(e,t,n):Object(m.k)(e,t,n),!o)return{animationLevel:l};if(i=r&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(r)?Object(m.nb)(e,t):Object(m.m)(e,t),r===s.h.Inline||r===s.h.Album)d=Object(m.db)(e,t,a)||Object(m.X)(e,t,a);else if(r===s.h.SharedMedia){const t=Object(m.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};d=a}return{chatId:t,threadId:a,messageId:n,senderId:o.senderId,origin:r,message:o,chatMessages:i,collectionIds:d,animationLevel:l}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:m,avatarOwner:u,message:I,chatMessages:P,collectionIds:M,openMediaViewer:F,closeMediaViewer:L,openForwardMenu:A,focusMessage:D,animationLevel:R})=>{const G=Object(n.q)(null),q=Boolean(u||a),$=I?Object(d.Q)(I):void 0,H=I?Object(d.G)(I):void 0,V=I?Object(d.O)(I):void 0,W=Boolean($),K=Boolean(H||$),Q=Boolean(V),_=V?V.isGif:void 0,X=m===s.h.SharedMedia,J=m===s.h.SearchResult,ee=R>=1?"mv-slide":"none",te=2===R?"slide-fade":"none",ae=2===R,ne=u?`avatar${u.id}.jpg`:I&&Object(d.B)(I),ce=Object(y.a)(c),[re,le]=Object(n.r)(!1),[ie,me]=Object(n.r)(!1),[he,be]=Object(n.r)(1),[pe,ge]=Object(n.r)({x:0,y:0}),ve=Object(n.p)(()=>W&&a?[a]:Object(d.i)(P||{},M||[],X),[W,a,P,M,X]),Ee=a?ve.indexOf(a):-1,fe=0===Ee||-1===Ee,Oe=Ee===ve.length-1||-1===Ee;function je(e){return u?Object(d.f)(u,e?"big":"normal"):I&&Object(d.D)(I,e?"viewerFull":"viewerPreview")}!q||ce&&ce===c&&G.current||(G.current=Ee);const Ce=Object(v.a)(I&&(X||J)&&Object(d.D)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ae&&350),ye=Object(v.a)(je(),void 0,u?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ae&&350),{mediaData:ke,downloadProgress:Ne}=Object(E.a)(je(!0),void 0,I&&Object(d.C)(I,"viewerFull"),void 0,ae&&350),Ie=H||V?(H||V).blobUrl:void 0;let Se=!Q&&(Ie||ke)||ye||Ce;const we=function(e){const t=Object(n.q)();let a=!1;Object(O.a)(()=>{if(a=!0,t.current=void 0,!e)return;const n=new Image;if(n.src=e,!n.width)return;const c=Object(C.f)(n);Object(f.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const c=Object(j.a)(e||void 0,Boolean(t.current));return t.current||!a&&c||e||void 0}(!Se&&I&&Object(d.E)(I));Se||m===s.h.SearchResult||(Se=we);const Pe=K?Object(d.R)(W?Object(d.Q)(I):Object(d.G)(I)):void 0,Me=Q?Object(d.bb)(Object(d.O)(I)):void 0;Object(n.n)(()=>{o.f&&document.body.classList.toggle("is-media-viewer-open",q)},[q]);const Fe=Object(g.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Fe):"function"==typeof e.addListener&&e.addListener(Fe),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Fe):"function"==typeof e.removeListener&&e.removeListener(Fe)}},[Fe]);const Le=Object(y.a)(I),Ae=Object(y.a)(m),Te=Object(y.a)(u),De=Object(y.a)(Se);Object(n.n)(()=>{if(ae&&q&&!Le&&!Te){Object(k.b)(350+l.c);const e=I?Object(N.a)(I):void 0;S(Boolean(e),m,Se,I)}ae&&!q&&(Le||Te)&&(Object(k.b)(350+l.c),w(Ae,De,Le||void 0))},[ae,q,m,Ae,I,Le,Te,Se,De]),Object(n.n)(()=>{let e;return ie?le(!0):e=window.setTimeout(()=>{le(!1)},350),()=>{e&&window.clearTimeout(e)}},[ie]);const Be=()=>{me(!1),be(1),ge({x:0,y:0})},xe=Object(n.m)(()=>{me(!ie),be(ie?1:1.5),ie&&ge({x:0,y:0})},[ie]),Ue=Object(n.m)((e,t=!1)=>{be(e),1===e&&t&&Be()},[]),Re=Object(n.m)(()=>{L(),Be()},[L]),Ge=Object(n.m)(()=>{Re(),D({chatId:e,threadId:t,messageId:a})},[Re,e,t,D,a]),qe=Object(n.m)(()=>{A({fromChatId:e,messageIds:[a]}),Be()},[A,e,a]);Object(n.n)(()=>q?Object(b.a)(()=>{ie?Be():Re()}):void 0,[Re,q,ie]),Object(n.n)(()=>{Q&&!_&&Object(p.b)()},[_,Q]);const ze=Object(n.m)((e,t)=>{let a=ve.indexOf(e);return(-1===t&&a>0||1===t&&a{fe||F({chatId:e,threadId:t,messageId:a?ze(a,-1):void 0,origin:m})},[e,t,ze,fe,a,F,m]),He=Object(n.m)(()=>{Oe||F({chatId:e,threadId:t,messageId:a?ze(a,1):void 0,origin:m})},[e,t,ze,Oe,a,F,m]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":$e();break;case"Right":case"ArrowRight":He()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=_&&!o.d;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{ie||Re()},onSwipe:o.k?(e,t)=>{t===h.a.Right?$e():t===h.a.Left?He():Re()}:void 0})},[Re,_,ie,He,$e,re]);const Ve=Object(n.m)((e,t)=>{ge({x:e,y:t})},[]),We=Object(T.a)();function Ye(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ue(ke||ye,Object(i.g)(i.a,!1)));if(I){const e=Object(N.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},K&&ue(Ie||ke||ye||Ce,I&&Object(i.g)(Pe,c)),Q&&n.a.createElement(se,{key:a,url:Ie||ke,isGif:_,posterData:Se,posterSize:I&&Object(i.g)(Me,c,!0),downloadProgress:Ne,fileSize:V.size,isMediaViewerOpen:q,noPlay:!t,onClose:Re}),e&&n.a.createElement(Z,{text:e,onClick:Ge,isHideable:Q}))}}function Ke(){return n.a.createElement(z,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(B.a,{id:"MediaViewer",className:ie?"zoomed":"",isOpen:q},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head"},o.f&&n.a.createElement(U.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:We("Close"),onClick:Re},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(x.a,{activeKey:G.current,name:te},Ke),n.a.createElement(Y,{mediaData:ke||ye,isVideo:Q,isZoomed:ie,message:I,fileName:ne,onCloseMediaViewer:Re,onForward:qe,onZoomToggle:xe,isAvatar:Boolean(u)})),n.a.createElement(de,{noWrap:!re,canPan:ie,panDeltaX:pe.x,panDeltaY:pe.y,zoomLevel:he,onPan:Ve},n.a.createElement(x.a,{className:"slide-container",activeKey:Ee,name:ee},Ye)),!fe&&n.a.createElement("button",{type:"button",className:"navigation prev "+(Q&&!_&&"inline"),"aria-label":We("AccDescrPrevious"),onClick:$e}),!Oe&&n.a.createElement("button",{type:"button",className:"navigation next "+(Q&&!_&&"inline"),"aria-label":We("Next"),onClick:He}),n.a.createElement(oe,{isShown:ie,onChangeZoom:Ue})))})),be=a(46),pe=a(118),ge=a(16),ve=a(98),Ee=a(39),fe=a(101),Oe=a(94),je=a(96),Ce=a(111);a(247);var ye=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n},currentUserId:c}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,currentUser:c?Object(m.Db)(e,c):void 0}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,listIds:t,orderedPinnedIds:a,currentUser:c,isOpen:r,setForwardChatId:s,exitForwardMode:l,loadMoreChats:i})=>{const[m,u]=Object(n.r)(""),h=Object(n.q)(null);Object(n.n)(()=>{r?o.f||setTimeout(()=>{requestAnimationFrame(()=>{h.current&&h.current.focus()})},500):(h.current&&h.current.blur(),setTimeout(()=>{u("")},300))},[r]);const b=Object(n.p)(()=>{const n=t?Object(d.Ab)(e,t,a):void 0;if(!n)return;const r=c?e[c.id]:void 0;return[...r?[r]:[],...n.pinnedChats.filter(({id:e})=>!r||e!==r.id),...n.otherChats.filter(({id:e})=>!r||e!==r.id)]},[e,t,a,c]),p=Object(n.p)(()=>{if(b)return b.filter(e=>!m||Object(be.a)(Object(d.l)(e,c),m)).map(({id:e})=>e)},[b,m,c]),[g,v]=Object(pe.a)(i,p,Boolean(m)),E=Object(n.m)(e=>{u(e.currentTarget.value)},[]),f=Object(T.a)(),O=n.a.createElement("div",{className:"modal-header"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:f("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Ee.a,{ref:h,value:m,onChange:E,placeholder:f("ForwardTo")}));return n.a.createElement(ve.a,{isOpen:r,onClose:l,className:"ForwardPicker",header:O},g&&g.length?n.a.createElement(fe.a,{className:"picker-list custom-scroll",items:g,onLoadMore:v,isDisabled:Boolean(m)},g.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>s({id:e})},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e})))):g&&!g.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,null))})),ke=a(158);a(248);function Ne(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var Ie=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(T.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(ve.a,{isOpen:!0,onClose:t,className:"error",title:Ne(e)},n.a.createElement("p",null,Object(ke.a)(e)),n.a.createElement(U.a,{isText:!0,onClick:t},a("OK")))))})),Se=a(170);var we=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(Se.a,{message:Object(G.a)(e,["emoji","br","links"]),onDismiss:t})))}));a(249);const Pe=["M","T","W","T","F","S","S"];function Me(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=new Date,b=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[g,v]=Object(n.r)(b),[E,f]=Object(n.r)(Fe(b.getHours())),[O,j]=Object(n.r)(Fe(b.getMinutes())),C=g.getFullYear(),y=g.getMonth(),k=g.getDate();Object(n.n)(()=>{r&&v(b)},[r,b]);const N=c&&C>=h.getFullYear()&&y>=h.getMonth()||p&&C>=p.getFullYear()&&y>=p.getMonth(),I=a&&C<=h.getFullYear()&&y<=h.getMonth(),S=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return f(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(g.getTime());n.setHours(a),v(n);const c=Fe(a);f(c),e.target.value=c},[g]),P=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return j(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(g.getTime());n.setMinutes(a),v(n);const c=Fe(a);j(c),e.target.value=c},[g]);return n.a.createElement(ve.a,{isOpen:r,onClose:m,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:m},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(R.f)(g,o.f)),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){v(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",disabled:N,onClick:N?void 0:function(){v(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Pe.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,e))),S.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void v(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(le.a)("day-button",Me(C,y,e,a?h:void 0,c?h:p)?"disabled":""+(e?"clickable":""),e===k&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:E,onChange:w}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P})),n.a.createElement("div",{className:"footer"},n.a.createElement(U.a,{onClick:function(){d(g)}},s?function(e){const t=Object(R.c)(e,!0);return`Send ${"Today"===t?t:"on "+t} at ${Object(R.h)(e)}`}(g):l),i&&n.a.createElement(U.a,{onClick:u,isText:!0},i)))});var Ae=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(m.y)(e)||{},{canDeleteForAll:c}=n&&Object(m.b)(e,t,n)||{},r=Object(m.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(d.lb)(r.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(d.ib)(r)&&!c,willDeleteForAll:r&&Object(d.nb)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,onClose:i,deleteMessages:m,deleteScheduledMessages:d})=>{const u=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];m({messageIds:e,shouldDeleteForAll:!0}),i()},[m,a.id,i,c]),h=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];t?d({messageIds:e}):m({messageIds:e,shouldDeleteForAll:!1}),i()},[c,a.id,t,i,d,m]),b=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,"This will delete it just for you, not for other participants in the chat."),o&&n.a.createElement("p",null,"This will delete it for everyone in this chat."),r&&n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},"Delete for ",s?"me and ":"Everyone",s&&Object(G.a)(s)),n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},"Delete",r?" just for me":""),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var Te=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.lb)(t),n=Object(m.O)(e,t),c=Object(m.f)(e,t),r=!!c&&Object(d.jb)(c),s=!!c&&Object(d.ib)(c),l=!!c&&Object(d.nb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(d.lb)(c.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,onClose:i,pinMessage:m})=>{const d=Object(n.m)(()=>{m({chatId:a,messageId:t,isUnpin:!1}),i()},[m,a,t,i]),u=Object(n.m)(()=>{m({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,m]),h=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:i,className:"pin",header:n.a.createElement("div",{className:"modal-header"},n.a.createElement("h3",{className:"modal-title"},h("PinMessageAlertTitle")))},c?n.a.createElement("p",null,h("PinMessageAlertChannel")):r||s?n.a.createElement("p",null,h("PinMessageAlert")):n.a.createElement("p",null,h("PinMessageAlertChat")),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:d},o?"Pin for me and "+o:"Pin and notify all memebers"),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var De=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=t?Object(m.gb)(e,t):[];return{pinnedMessagesCount:a?a.length:0}})(({isOpen:e,pinnedMessagesCount:t,onClose:a,onUnpin:c})=>{const r=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:a,className:"unpin-all",header:n.a.createElement("div",{className:"modal-header"},n.a.createElement("h3",{className:"modal-title"},r("UnpinAllMessages")))},n.a.createElement("p",null,"Do you want to unpin all ",t," messages in this chat?"),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))})),Be=a(36),xe=a(50);var Ue=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(m.e)(e),c=Object(m.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(d.lb)(c.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(d.ib)(c)&&!n,willDeleteForAll:c&&Object(d.nb)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:m,exitMessageSelectMode:d})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),d(),o()},[i,d,a,o]),h=Object(n.m)(()=>{t?m({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),d(),o()},[t,d,o,m,a,i]),b=Object(T.a)();if(a)return n.a.createElement(ve.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:"Delete Messages?"},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},"Delete for ",r?"me and ":"Everyone",r&&Object(G.a)(r)),n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},"Delete",c?" just for me":""),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:o},b("Cancel")))}));a(250);var Re=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(m.y)(e)||{},{canDelete:a}=Object(m.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(m.pb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,m,d]=Object(Be.a)();Object(n.n)(()=>t&&!i?Object(xe.a)({onBackspace:m,onDelete:m,onEsc:l}):void 0,[t,i,m,l]);const u=Object(y.a)(r||void 0,!0),h=t?r:u,b=Object(T.a)(),p=b("VoiceOver.Chat.MessagesSelected",h),g=Object(le.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:g},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(U.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:p},p),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(V.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:m,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Ue,{isOpen:i,isSchedule:c,onClose:d}))})),Ge=a(157),qe=a(44),ze=a(160),$e=a(148);var He=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),n=a&&Object(d.T)(a);return{chat:a,privateChatUser:n?Object(m.Db)(e,n):void 0,isPinned:Object(m.M)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withHandle:r,onClick:s})=>{const[l,o,i]=Object(Be.a)(),m=Object(ze.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o});if(t)return n.a.createElement(Oe.a,{className:"chat-item-clickable search-result",onClick:()=>s(e),contextActions:m},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e,withHandle:r,avatarSize:"large"}):n.a.createElement(Ce.a,{chatId:e,withHandle:r,avatarSize:"large"}),n.a.createElement($e.a,{isOpen:l,onClose:i,chat:t}))})),Ve=a(129);a(251);const We=Object(K.g)(e=>e(),6e4,!0);var Ye=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const m=Object(n.q)(null);Object(n.n)(()=>{We(()=>{r(),s()})},[r,s]),Object(Ve.a)(m,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(T.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section"},n.a.createElement("div",{ref:m,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>u(e)},n.a.createElement(q.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(G.a)(Object(d.Y)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header"},h("Recent"),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(He,{chatId:e,onClick:u}))))})),Ke=a(131),Ze=a(110);a(252);var Qe=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t);if(!a)return{};const n=Object(d.T)(a);return{chat:a,...n&&{privateChatUser:Object(m.Db)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(d.E)(e),m=Object(v.a)(Object(d.D)(e,"micro")),u=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]);if(Object(T.a)(),c)return n.a.createElement(Oe.a,{className:"ChatMessage chat-item-clickable",ripple:!o.f,onClick:u},n.a.createElement(q.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",null,Object(G.a)(Object(d.l)(c,r))),c.isVerified&&n.a.createElement(Ke.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Ze.a,{className:"date"},Object(R.g)(1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message"},function(e,t,a){if(!t)return Object(G.a)(Object(d.M)(e));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:t,alt:""}),Object(d.O)(e)&&n.a.createElement("i",{className:"icon-play"}),Object(G.a)(Object(d.M)(e,!0),["emoji","highlight"],{highlight:a}))}(e,m||i,t)))))}));a(253);var _e=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(R.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),c=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${c-a}-${e}`);t.push({date:n,text:Object(R.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),Xe=a(108),Je=a(127),et=a(11);const tt=(e,t)=>Number(t.isVerified)-Number(e.isVerified),at=Object(K.g)(e=>e(),500,!0);var nt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:c,messages:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:m}=e.globalSearch,{chats:d,users:u}=o||{},{chats:h,users:b}=i||{},{byChatId:p}=r,{foundIds:g}=m&&m.text||{};return{currentUserId:c,localContactIds:n,localChats:h,localUsers:b,globalChats:d,globalUsers:u,foundIds:g,globalMessagesByChatId:p,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChats:l,localUsers:i,globalChats:m,globalUsers:h,foundIds:b,globalMessagesByChatId:p,chatsById:g,usersById:v,fetchingStatus:E,lastSyncTime:f,onReset:O,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const[I,S]=Object(n.r)(!1),[w,P]=Object(n.r)(!1),M=Object(n.m)(({direction:t})=>{f&&t===s.e.Backwards&&at(()=>{k({type:"text",query:e})})},[f,k,e]),F=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.f||O()},[c,C,y,O]),L=Object(n.m)(e=>{N({id:e})},[N]),A=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return qe.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(d.Z)(a);return n&&Object(be.a)(n,e)||Object(be.a)(a.username,e)}).map(e=>v[e]):[];return Object(u.o)([...Object(be.a)(Object(et.b)("SavedMessages"),e)?[c]:[],...[...t,...l||[],...i||[]].sort(tt).map(e=>e.id)])},[e,r,l,i,v,c]),D=Object(n.p)(()=>!e||e.length<4||!m||!h?qe.a:Object(u.o)([...m,...h].sort(tt).map(e=>e.id)),[m,h,e]),B=Object(n.p)(()=>(e||t)&&b&&0!==b.length?b.map(e=>{const[t,a]=e.split("_").map(Number);return p&&p[t]&&p[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):qe.a,[b,p,e,t]),x=Object(n.m)(()=>{S(!I)},[I]),U=Object(n.m)(()=>{P(!w)},[w]),R=Object(T.a)();const G=E&&!E.chats&&!E.messages&&!A.length&&!D.length&&!B.length;return e||t?n.a.createElement(fe.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:M,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(_e,{searchDate:a,onSelect:j})),G&&n.a.createElement(Xe.a,null),!!A.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},A.map(e=>n.a.createElement(Je.a,{chatOrUserId:e,onClick:L,clickArg:e}))),!!A.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},A.length>3&&n.a.createElement(Ze.a,{onClick:x},I?"Show less":"Show more"),"Contacts and Chats"),A.map((e,t)=>{if(I||!(t>=3))return n.a.createElement(He,{chatId:e,onClick:F})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},D.length>3&&n.a.createElement(Ze.a,{onClick:U},w?"Show less":"Show more"),"Global Search"),D.map((e,t)=>{if(w||!(t>=3))return n.a.createElement(He,{chatId:e,withHandle:!0,onClick:F})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},R("SearchMessages")),B.map((function(t){const a=Object(d.M)(t),c=g[t.chatId];if(a&&c)return n.a.createElement(Qe,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Ye,{onReset:O})}));const ct=Object(K.g)(e=>e(),500,!0);var rt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:m,onSearchDateSelect:u})=>{const h=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&ct(()=>{m({type:"text",query:e,chatId:t})})},[t,i,m,e]),b=Object(n.p)(()=>c&&0!==c.length?c.map(e=>{const[t,a]=e.split("_").map(Number);return r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):qe.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!b.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content custom-scroll chat-list",items:b,onLoadMore:h,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(_e,{searchDate:a,onSelect:u})),p&&n.a.createElement(Xe.a,null),!!b.length&&b.map((function(t){const a=Object(d.M)(t),c=l[t.chatId];if(a&&c)return n.a.createElement(Qe,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function st(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:m}=s&&s[o]||{};return{isLoading:void 0===m||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:m,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var lt=a(154),ot=a(109);const it=Object(K.g)(e=>e(),500,!0);var mt=Object(n.h)(Object(c.h)(st("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:m})=>{const d=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&&it(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),u=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):qe.a,[c,r]),h=Object(n.m)((e,t)=>{m({chatId:t,messageId:e,origin:s.h.SearchResult})},[m]);const b=Object(ot.a)([e],l.ib)&&!a,p=b&&r&&r.length>0&&!e,g=b&&r&&r.length>0&&e,v=Object(le.a)("search-content custom-scroll",g&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:v,items:u,itemSelector:e?".ListItem":".Media",onLoadMore:d,noFastList:!0},!b&&n.a.createElement(ge.a,null),b&&(!r||0===r.length)&&n.a.createElement(Xe.a,null),p&&n.a.createElement("div",{className:"media-list"},u.map(e=>n.a.createElement(lt.a,{key:e.id,idPrefix:"search-media",message:e,onClick:h}))),g&&u.map(e=>n.a.createElement(Qe,{key:e.id,chatId:e.chatId,message:e}))))}));function dt(e,t,a){const{senderId:n}=e;if(!n)return;const c=Object(d.lb)(n)?a[n]:t[n];let r=Object(d.U)(c);const s=t[e.chatId];return s&&(Object(d.lb)(n)&&c.isSelf?r="You → "+Object(d.l)(s):Object(d.kb)(s)&&(r+=" → "+Object(d.l)(s))),r}var ut=a(173);const ht=Object(K.g)(e=>e(),500,!0);var bt=Object(n.h)(Object(c.h)(st("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:m,searchMessagesGlobal:d,focusMessage:u})=>{const h=Object(n.m)(({direction:a})=>{m&&a===s.e.Backwards&&ht(()=>{d({type:"links",query:e,chatId:t})})},[m,d,e,t]),b=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):qe.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const g=Object(ot.a)([e],l.ib)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:b,onLoadMore:h,noFastList:!0},!g&&n.a.createElement(ge.a,null),g&&(!i||0===i.length)&&n.a.createElement(Xe.a,null),g&&i&&i.length>0&&b.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(b[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(ut.a,{key:e.id,message:e,senderTitle:dt(e,c,r),onMessageClick:p}))})))})),pt=a(151);const gt=Object(K.g)(e=>e(),500,!0);var vt=Object(n.h)(Object(c.h)(st("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(n.m)(({direction:a})=>{m&&a===s.e.Backwards&>(()=>{u({type:"documents",query:e,chatId:t})})},[m,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(d.y)(n)?n:void 0}).filter(Boolean):qe.a,[o,i]),g=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const v=Object(ot.a)([e],l.ib)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(ge.a,null),v&&(!i||0===i.length)&&n.a.createElement(Xe.a,null),v&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(pt.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:dt(e,c,r),className:"scroll-item",onDateClick:g}))})))})),Et=a(156);const ft=Object(K.g)(e=>e(),500,!0);var Ot=Object(n.h)(Object(c.h)(st("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:m,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const p=e?"voice":"audio",g=Object(n.m)(({direction:e})=>{d&&e===s.e.Backwards&&ft(()=>{u({type:p,query:t,chatId:a})})},[p,d,u,t,a]),v=Object(n.p)(()=>m&&i?m.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):qe.a,[i,m]),E=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const O=Object(ot.a)([t],l.ib)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:v,onLoadMore:g,noFastList:!0},!O&&n.a.createElement(ge.a,null),O&&(!m||0===m.length)&&n.a.createElement(Xe.a,null),O&&m&&m.length>0&&v.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(v[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(Et.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:dt(e,r,o),date:e.date,lastSyncTime:d,className:"scroll-item",onPlay:f,onDateClick:E}))})))}));a(254);const jt=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],Ct=[{type:s.c.ChatList,title:"All Messages"},...jt.slice(1)],yt=Object.keys(s.c).length/2;var kt=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,currentContent:a=s.c.ChatList,chatId:c,setGlobalSearchContent:r,setGlobalSearchDate:l,onReset:o})=>{const[i,m]=Object(n.r)(0),d=Object(n.p)(()=>Object(R.l)(e),[e]),u=Object(n.m)(e=>{const t=jt[e];r({content:t.type}),m(e)},[r]),h=Object(n.m)(e=>{l({date:e.getTime()/1e3})},[l]);return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Ge.a,{activeTab:i,tabs:c?Ct:jt,onSwitchTab:u}),n.a.createElement(x.a,{name:"slide",renderCount:yt,activeKey:a},()=>{switch(a){case s.c.ChatList:return c?n.a.createElement(rt,{searchQuery:e,dateSearchQuery:d,onReset:o,onSearchDateSelect:h}):n.a.createElement(nt,{searchQuery:e,searchDate:t,dateSearchQuery:d,onReset:o,onSearchDateSelect:h});case s.c.Media:return n.a.createElement(mt,{searchQuery:e});case s.c.Links:return n.a.createElement(bt,{searchQuery:e});case s.c.Files:return n.a.createElement(vt,{searchQuery:e});case s.c.Music:return n.a.createElement(Ot,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(Ot,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function Nt(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const It=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],St=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],wt=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Pt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Mt(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,wt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,Pt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Ft(e){if(e){const{includedChatIds:t,...a}=e;if(Object.values(a).filter(Boolean).length>1||t&&t.length)return"";if(a.bots)return"Bots";if(a.groups)return"Groups";if(a.channels)return"Channels";if(a.contacts)return"Contacts";if(a.nonContacts)return"Non-Contacts"}return""}const Lt={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},At=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,wt)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,Pt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,wt),title:e.folder.title?e.folder.title:Ft(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,Pt),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:a,...n}=t.payload;return{mode:"edit",folderId:e,folder:n,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return Lt;default:return e}};const Tt={currentPassword:"",password:"",hint:"",email:""},Dt=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return Tt;default:return e}};var Bt=a(107);var xt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{const[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),h=Object(n.m)(()=>{m(!0)},[]),b=Object(n.m)(()=>{m(!1)},[]),p=Object(n.m)(()=>{u(!0)},[]),g=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{b(),r()},[b,r]),E=Object(n.m)(()=>{g(),l({id:t}),a()},[t,g,l,a]),f=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(U.a,{round:!0,ripple:!o.f,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),O=Object(T.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:O("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case s.m.EditProfile:return n.a.createElement("h3",null,O("EditProfile"));case s.m.General:return n.a.createElement("h3",null,O("General"));case s.m.Notifications:return n.a.createElement("h3",null,O("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,O("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,O("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,O("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,O("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,O("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,O("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,O("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,O("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,O("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,O("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,O("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,O("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,O("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,O("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,O("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,O("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,O("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,O("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,O("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,O("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,O("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,O("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,O("FilterEdit")),t&&n.a.createElement(H.a,{className:"settings-more-menu",trigger:f,positionX:"right"},n.a.createElement(V.a,{icon:"delete",destructive:!0,onClick:p},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.FoldersIncludedChats?n.a.createElement("h3",null,O("FilterInclude")):n.a.createElement("h3",null,O("FilterExclude")),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:c,ariaLabel:O("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,O("SETTINGS")),n.a.createElement(H.a,{className:"settings-more-menu",trigger:f,positionX:"right"},n.a.createElement(V.a,{icon:"logout",onClick:h},O("LogOutTitle"))))}}(),n.a.createElement(Bt.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(Bt.a,{isOpen:d,onClose:g,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),Ut=a(19);var Rt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(m.Db)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(q.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(d.Z)(t)),n.a.createElement("p",{className:"phone"},Object(Ut.c)(t.phoneNumber))),n.a.createElement(Oe.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("EditProfile")),n.a.createElement(Oe.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(Oe.a,{icon:"settings",onClick:()=>e(s.m.General)},a("GeneralSettings")),n.a.createElement(Oe.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(Oe.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(Oe.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),Gt=a(120);a(255);var qt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(le.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(U.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const zt=/https:\/\/t\.me\/?/i,$t=/^([a-zA-Z0-9_]+)$/,Ht=Object(K.a)(e=>e(),250,!1);var Vt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(T.a)(),m=t?"SetUrl":"Username",d=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,d+" is too short"]:l.length>32?[void 0,d+" is too long"]:$t.test(l)?void 0===c?[]:[c?i(m+"Available","Username"):void 0,!1===c?i(m+"InUse"):void 0]:[void 0,d+" contains invalid characters"]:[],[l,c,i,m,d]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(zt,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&$t.test(e)}(a);n&&Ht(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(Ee.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:d,error:h,success:u,readOnly:a})});const Wt=Object(K.g)(e=>e(),6e4,!0);var Yt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(m.Db)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(d.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:m,updateProfile:d,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[p,g]=Object(n.r)(!1),[E,f]=Object(n.r)(),[O,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),F=o===s.j.InProgress,L=!1===w,A=Object(n.p)(()=>!L&&(Boolean(O)||p||!0===i),[O,p,L,i]);Object(n.n)(()=>{Wt(()=>{m()})},[m]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(g(!1),b(!1),f(void 0))},[o]);const B=Object(n.m)(e=>{j(e)},[]),x=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),R=Object(n.m)(e=>{S(e.target.value),g(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?f("Bio can' be longer than 70 characters"):d({photo:O,...p&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):f("Please provide your first name")},[O,C,k,I,p,w,h,d]),$=Object(T.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:M,onChange:B,title:"Edit your profile photo",disabled:F}),n.a.createElement(Ee.a,{value:C,onChange:x,label:$("FirstName"),disabled:F,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(Ee.a,{value:k,onChange:U,label:$("LastName"),disabled:F}),n.a.createElement(Ee.a,{value:I,onChange:R,label:$("UserBio"),disabled:F,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description"},Object(G.a)($("BioAbout"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},$("Username")),n.a.createElement(Vt,{currentUsername:w||"",isLoading:F,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description"},Object(G.a)($("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description"},"This link opens a chat with you:",n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(qt,{isShown:A,onClick:z,disabled:F,ariaLabel:"Save changes"},F?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Kt=a(116),Zt=a(106);const Qt=Object(K.g)(e=>e(),6e4,!0);var _t=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,loadRecommendedChatFolders:i,addChatFolder:m,showError:u})=>{const[h,b]=Object(n.r)(),[p,g]=Object(n.r)(!1),v=Object(n.m)(()=>g(!0),[]);Object(n.n)(()=>{h||Object(Kt.a)("FoldersAll").then(b)},[h]),Object(n.n)(()=>{Qt(()=>{i()})},[i]);const E=Object(n.m)(()=>{Object.keys(s).length>=10?u({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,u,e]),f=Object(T.a)(),O=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(d.o)(a,c,n,e,f)}})},[r,a,s,c,f]),j=Object(n.m)(e=>{Object.keys(s).length>=10?u({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):m({folder:e})},[s,m,u]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},h&&n.a.createElement(Zt.a,{id:"settingsFoldersMain",size:l.mb,animationData:h,play:p,noLoop:!0,onLoad:v})),n.a.createElement("p",{className:"settings-item-description mb-3"},f("CreateNewFilterInfo")),n.a.createElement(U.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:E},n.a.createElement("i",{className:"icon-add"}),f("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},f("Filters")),O&&O.length?O.map(e=>n.a.createElement(Oe.a,{className:"mb-2",narrow:!0,onClick:()=>t(s[e.id])},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle)))):O&&!O.length?n.a.createElement("p",{className:"settings-item-description my-4"},"You have no folders yet."):n.a.createElement(ge.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},f("FilterRecommended")),o.map(e=>n.a.createElement(Oe.a,{className:"mb-2",narrow:!0,onClick:()=>j(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(U.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0},f("Add")))))))}));a(256);var Xt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>n.a.createElement(U.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t);const Jt="Please provide a title for this folder.",ea="Please select at least one chat for this folder.";var ta=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:m,loadMoreChats:h})=>{const[b,p]=Object(n.r)(),[g,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[f,O]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=Mt(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=Mt(e,"excluded");Object(n.n)(()=>{b||Object(Kt.a)("FoldersNew").then(p)},[b]),Object(n.n)(()=>{O(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[f?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,f,s,o]);Object(n.n)(()=>{(S.lengthO(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?It.find(({key:t})=>t===e):St.find(({key:t})=>t===e);if(a)return n.a.createElement(Oe.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},P(a.title))}(t,e)),a.map(e=>n.a.createElement(Oe.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(d.lb)(e)?n.a.createElement(je.a,{avatarSize:"small",userId:e}):n.a.createElement(Ce.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Xt,{count:r,itemName:"chat",onClick:s}))}return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},b&&n.a.createElement(Zt.a,{id:"settingsFoldersEdit",size:l.mb,animationData:b,play:g&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3"},P("FilterIncludeInfo")),n.a.createElement(Ee.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Jt?Jt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===ea&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2"},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterInclude")),n.a.createElement(Oe.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterExclude")),n.a.createElement(Oe.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(qt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):m({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:ea}):t({type:"setError",payload:Jt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),aa=a(40);a(174),a(257);var na=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const m=Object(n.q)(null),u="included"===e?It:St,h=a.length+c.length>10,b=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{m.current.focus()})},500)},[]);const p=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),s(t)},[a,s]),g=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(T.a)();const[f,O]=Object(pe.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(Je.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(Je.a,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type"},E(e.title)),n.a.createElement(aa.a,{label:"",checked:c.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header"},E("FilterChats"))),f&&f.length?f.map((function(e){const t=a.includes(e);return n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>p(e),ripple:!0,disabled:!t&&b},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e,withChatType:!0}),n.a.createElement(aa.a,{label:"",checked:t,round:!0}))})):f&&!f.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,{key:"loading"})))});var ca=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:m}=t,{selectedChatIds:u,selectedChatTypes:h}=Mt(t,e,!0),b=Object(n.p)(()=>{const e=r?Object(d.Ab)(c,r,s,"all"):void 0,t=l?Object(d.Ab)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(b)return b.filter(e=>!m||Object(be.a)(Object(d.l)(e),m)||u.includes(e.id)).map(({id:e})=>e)},[b,m,u]),g=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),v=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),E=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(na,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:m,onSelectedIdsChange:v,onSelectedChatTypesChange:E,onFilterChange:g,onLoadMore:i}):n.a.createElement(ge.a,null)}));a(258);var ra=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),m=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),d=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(_t,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(ta,{state:t,dispatch:a,onAddIncludedChats:m,onAddExcludedChats:d,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(ca,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(ca,{mode:"excluded",state:t,dispatch:a});default:return}}),sa=a(95);a(259);var la=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),o=Object(le.a)("RangeSlider",r&&"disabled"),i=Object(n.p)(()=>{if(e)return c/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(c-t.min)/e*100}return 0},[c,e,t]),[m,d,u]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:o},a&&n.a.createElement("div",{className:"slider-top-row"},n.a.createElement("span",{className:"label"},a),t&&n.a.createElement("span",{className:"value"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${i}%`}),n.a.createElement("input",{min:m,max:d,value:c,step:u,type:"range",onChange:l}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(le.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),oa=a(117),ia=a(103),ma=a(45);var da=Object(n.h)(({size:e=l.sb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(sa.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:m,transitionClassNames:d}=Object(ia.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!m&&Object(ma.c)(t.title,2),m&&i&&n.a.createElement(Zt.a,{id:o,size:e,animationData:i,className:d}))});var ua=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(sa.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(ia.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(ma.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(260);var ha=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:m})=>{const d=Object(n.q)(null),{isAnimated:u}=e,h="sticker"+e.id,b="sticker-button-"+e.id,p=Object(sa.b)(d,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,E=Object(v.a)(h+"?size=m",!p,r.ApiMediaFormat.BlobUrl),f=p&&!c,O=Object(v.a)(h,!f,r.ApiMediaFormat.Lottie),[j,C,y]=Object(Be.a)(Boolean(O)),k=j&&f,{shouldRenderThumb:N,shouldRenderFullMedia:I,transitionClassNames:S}=Object(ia.a)(E||k,"slow");Object(n.n)(()=>{f||y()},[y,f]);const w=Object(le.a)("StickerButton",u&&"animated",b,l),P=N&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:d,className:w,title:s||e&&e.emoji,style:P,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},I&&!k&&n.a.createElement("img",{src:E,className:S}),f&&O&&n.a.createElement(Zt.a,{id:h,animationData:O,play:!0,size:t,isLowPriority:!0,onLoad:C}),m&&n.a.createElement(U.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),m(e)}},n.a.createElement("i",{className:"icon-close"})))});a(261);var ba=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(T.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(Oe.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(U.a,{ariaLabel:e.title,color:"translucent"},e.isAnimated?n.a.createElement(da,{size:l.nb,stickerSet:e,observeIntersection:t}):n.a.createElement(ua,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Oe.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(r)},n.a.createElement(ha,{sticker:r,size:l.nb,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i"))))}),pa=a(152);const ga=o.k?void 0:[{value:"enter",label:"Send by Enter",subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:`Send by ${o.e?"Cmd":"Ctrl"} + Enter`,subLabel:"New line by Enter"}],va=["Solid and Steady","Nice and Fast","Lots of Stuff"];var Ea=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:o,shouldAutoDownloadMediaInPrivateChats:i,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:d,shouldAutoPlayGifs:u,shouldAutoPlayVideos:h,shouldSuggestStickers:b,shouldLoopStickers:p,setSettingOption:g,loadStickerSets:v,loadAddedStickers:E})=>{const f=Object(n.q)(null),{observe:O}=Object(sa.a)({rootRef:f}),[j,C,y]=Object(Be.a)(),[k,N]=Object(n.r)();Object(n.n)(()=>{v()},[v]),Object(n.n)(()=>{t&&t.length&&E()},[t,E]);const I=Object(n.m)(e=>{va.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),g({animationLevel:e})},[g]),S=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),g({messageTextSize:e})},[g]),w=Object(n.m)(e=>{N(e),C()},[C]),P=Object(T.a)(),M=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header"},P("SETTINGS")),n.a.createElement(la,{label:P("TextSize"),range:{min:12,max:20},value:c,onChange:S}),n.a.createElement(Oe.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},P("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},"Animation Level"),n.a.createElement("p",{className:"settings-item-description"},"Choose the desired animations amount."),n.a.createElement(la,{options:va,value:r,onChange:I})),ga&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("Keyboard")),n.a.createElement(oa.a,{name:"keyboard-send-settings",options:ga,onChange:e=>g({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AutoDownloadMedia")),n.a.createElement(aa.a,{label:P("Contacts"),checked:o,onCheck:e=>g({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(aa.a,{label:P("AutodownloadPrivateChats"),checked:i,onCheck:e=>g({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(aa.a,{label:P("AutodownloadGroupChats"),checked:m,onCheck:e=>g({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(aa.a,{label:P("FilterChannels"),checked:d,onCheck:e=>g({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AutoplayMedia")),n.a.createElement(aa.a,{label:P("GifsTab2"),checked:u,onCheck:e=>g({shouldAutoPlayGifs:e})}),n.a.createElement(aa.a,{label:P("VideosTitle"),checked:h,onCheck:e=>g({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AccDescrStickers")),n.a.createElement(aa.a,{label:P("SuggestStickers"),checked:b,onCheck:e=>g({shouldSuggestStickers:e})}),n.a.createElement(aa.a,{label:P("LoopAnimatedStickers"),checked:p,onCheck:e=>g({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},M&&M.map(e=>n.a.createElement(ba,{key:e.id,stickerSet:e,observeIntersection:O,onClick:w}))),k&&n.a.createElement(pa.a,{isOpen:j,fromSticker:k,onClose:y})))}));let fa;function Oa(e="*",t,a=!1){fa||(fa=document.createElement("input"),fa.setAttribute("type","file")),fa.setAttribute("accept",e),a?fa.removeAttribute("multiple"):fa.setAttribute("multiple","multiple"),fa.onchange=null,fa.value="",fa.onchange=t,fa.click()}function ja(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Ca(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function ya([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var Ia=a(13);a(262);var Sa=Object(n.h)(({wallpaper:e,isSelected:t,onClick:a})=>{const{slug:c,document:r}=e,o="wallpaper"+r.id,i=r.previewBlobUrl,m=Object(v.a)(o+"?size=m"),d=Object(j.a)(r.thumbnail&&r.thumbnail.dataUri,Boolean(m),300),{shouldRenderThumb:u,shouldRenderFullMedia:h,transitionClassNames:b}=Object(ia.a)(m||i,"slow"),[p,g]=Object(n.r)(!1),{mediaData:f,downloadProgress:O}=Object(E.a)(o,!p),k=!1===Object(y.a)(p),{shouldRender:N,transitionClassNames:I}=Object(Q.a)(p&&!f||c===s.n,void 0,k,"slow"),S=Object(n.m)(()=>{(async()=>{const e=await Object(C.e)(f);await Ia.d(l.l,l.l,e),a(c)})()},[f,a,c]);Object(n.n)(()=>{f&&S()},[f,S]);const w=Object(n.m)(()=>{f?S():g(e=>!e)},[f,S]),P=Object(le.a)("WallpaperTile",t&&"selected");return n.a.createElement("div",{className:P,onClick:w},n.a.createElement("div",{className:"media-inner"},u&&n.a.createElement("img",{src:d,className:"thumbnail",alt:""}),h&&n.a.createElement("img",{src:m||i,className:"full-media "+b,alt:""}),N&&n.a.createElement("div",{className:Object(le.a)("spinner-container",I)},n.a.createElement(W.a,{progress:O,onClick:w}))))});a(263);const wa=Object(K.g)(e=>e(),6e4,!0);var Pa=Object(n.h)(Object(c.h)(e=>{const{isBackgroundBlurred:t,customBackground:a}=e.settings.byKey,{loadedWallpapers:n}=e.settings;return{customBackground:a,isBackgroundBlurred:t,loadedWallpapers:n}},(e,t)=>Object(u.l)(t,["setSettingOption","loadWallpapers","uploadWallpaper"]))(({onScreenSelect:e,customBackground:t,isBackgroundBlurred:a,loadedWallpapers:c,setSettingOption:r,loadWallpapers:o,uploadWallpaper:i})=>{Object(n.n)(()=>{wa(()=>{o()})},[o]);const m=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),d=Object(n.m)(()=>{Oa("image/jpeg",m,!0)},[m]),u=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),h=Object(n.m)(()=>{r({customBackground:void 0,patternColor:l.s})},[r]),b=Object(n.m)(e=>{r({customBackground:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),m=i.getContext&&i.getContext("2d");if(!m)return t;const d=await Object(C.g)(e);c=d.naturalHeight||d.offsetHeight||d.height,n=d.naturalWidth||d.offsetWidth||d.width,i.height=c,i.width=n,m.drawImage(d,0,0);try{a=m.getImageData(0,0,n,c)}catch(e){return t}for(r=a.data.length;(s+=20){r({patternColor:Na(e)})})},[c,r]),p=Object(n.m)(e=>{r({isBackgroundBlurred:e.target.checked})},[r]),g=Object(T.a)(),v=c&&c[0]&&c[0].slug===s.n;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Oe.a,{icon:"camera-add",className:"mb-0",disabled:v,onClick:d},g("UploadImage")),n.a.createElement(Oe.a,{icon:"colorize",className:"mb-0",onClick:u},g("SetColor")),n.a.createElement(Oe.a,{icon:"favorite",onClick:h},g("ThemeResetToDefaults")),n.a.createElement(aa.a,{label:g("BackgroundBlurred"),checked:Boolean(a),onChange:p})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(Sa,{wallpaper:e,isSelected:t===e.slug,onClick:b}))):n.a.createElement(ge.a,null))}));a(264);const Ma=ya(ja("e6ebee")),Fa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function La(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Aa({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Ta=Object(n.h)(Object(c.h)(e=>({customBackground:e.settings.byKey.customBackground}),(e,t)=>Object(u.l)(t,["setSettingOption"]))(({customBackground:e,setSettingOption:t})=>{const a=Object(n.q)(null),c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(!0),[l,o]=Object(n.r)(function(e){return e&&e.startsWith("#")?ya(ja(e.replace("#",""))):Ma}(e)),i=Object(n.q)(l);Object(n.n)(()=>{i.current=l},[l]);const[m,d,b]=Object(Be.a)(),[p,g]=Object(n.r)(""),[v,E]=Object(n.r)(""),f=Object(n.q)(),O=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:c.current.offsetLeft,...Object(u.l)(c.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:r.current.offsetLeft,...Object(u.l)(r.current.getBoundingClientRect(),["width"])};function n(t){const n=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+a.current.scrollTop),e.height-1)],{huePosition:c}=La(i.current,f.current);o(Aa({colorPosition:n,huePosition:c},f.current)),d()}function s(e){const{colorPosition:a}=La(i.current,f.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);o(Aa({colorPosition:a,huePosition:n},f.current)),d()}f.current={colorRect:e,hueRect:t},Object(h.b)(c.current,{onCapture:n,onDrag:n,onRelease:b,onClick:b,withCursor:!0}),Object(h.b)(r.current,{onCapture:s,onDrag:s,onRelease:b,onClick:b,withCursor:!0})},[d,b]);const{colorPosition:j=[0,0],huePosition:C=0}=f.current?La(l,f.current):{},y=Ca(ka(l)),k=l[0],N=Ca(ka([k,1,1]));Object(n.n)(()=>{const e=ka(l),a="#"+Ca(e);g(e.join(", ")),E(a),s.current||t({customBackground:a,patternColor:Na(e)}),s.current=!1},[l,t]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ka([t,1,1]);let m=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),c=n.data;let r=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));o(ya(e))}e.currentTarget.value=t},[]),S=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&o(ya(ja(t.replace("#","")))),e.currentTarget.value=t},[]),w=Object(n.m)(e=>{o(ya(ja(e.currentTarget.dataset.color.replace("#",""))))},[]),P=Object(le.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",m&&"is-dragging");return n.a.createElement("div",{ref:a,className:P},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:c,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${j[0]}px, ${j[1]}px); background-color: #${y};`})),n.a.createElement("div",{ref:r,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${C}px); background-color: #${N};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(Ee.a,{value:v,label:"HEX",onChange:S}),n.a.createElement(Ee.a,{value:p,label:"RGB",onChange:I}))),n.a.createElement("div",{className:"predefined-colors"},Fa.map(e=>n.a.createElement("div",{className:e==="#"+y?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:w}))))}));var Da=Object(n.h)(Object(c.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(u.l)(t,["loadNotificationsSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationsSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:m})=>{Object(n.n)(()=>{o()},[o]);const d=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),d="contact"===l?t:"group"===l?c:s;m({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,isShowPreviews:d},..."showPreviews"===o&&{isShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,m]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(T.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("AutodownloadPrivateChats")),n.a.createElement(aa.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{d(e,"contact","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{d(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterGroups")),n.a.createElement(aa.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{d(e,"group","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{d(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterChannels")),n.a.createElement(aa.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{d(e,"broadcast","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{d(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("PhoneOther")),n.a.createElement(aa.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Ba=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:m,loadPrivacySettings:d,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),d()},[u,h,d]);const b=Object(T.a)();function p(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Oe.a,{icon:"delete-user",narrow:!0,onClick:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle"},b("Users",a)))),n.a.createElement(Oe.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(Oe.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},b("PrivacyTitle")),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle"},p(r)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle"},p(l)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle"},p(o)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle"},p(i)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle"},p(m))))))}));var xa=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(Be.a)();Object(n.n)(()=>{a()},[a]);const m=Object(n.m)(e=>{s(e),o(),Object(et.c)(e,()=>{i(),c({language:e})})},[o,i,c]),d=Object(n.p)(()=>e?function(e){return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a}))}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},d?n.a.createElement(oa.a,{name:"keyboard-send-settings",options:d,selected:r,loadingOption:l?r:void 0,onChange:m}):n.a.createElement(ge.a,null))}));function Ua(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var Ra=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:m})=>{const d=Object(T.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:d("P2PEverybody")},{value:"contacts",label:d("P2PContacts")}];default:return[{value:"everybody",label:d("P2PEverybody")},{value:"contacts",label:d("P2PContacts")},{value:"nobody",label:d("P2PNobody")}]}},[d,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=Ua(e),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return d("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return d("LastSeenTitle");case s.m.PrivacyProfilePhoto:return d("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return d("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return d("WhoCanAddMe");default:return}},[d,e]),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return d("CustomHelp");default:return}},[d,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),f=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),O=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{m({privacyKey:b,visibility:e})},[b,m]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},p),n.a.createElement(oa.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),g&&n.a.createElement("p",{className:"settings-item-description-larger"},g)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},d("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(Oe.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date"},"+",f),n.a.createElement("span",{className:"title"},d("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},d("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(Oe.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date"},"−",O),n.a.createElement("span",{className:"title"},d("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},d("EditAdminAddUsers"))))))}));function Ga(e){return[e.region,e.country].filter(Boolean).join(", ")}function qa(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var za=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(Be.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),m=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),d=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(T.a)();function h(e){return n.a.createElement(Oe.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size"},n.a.createElement("span",{className:"date"},Object(R.g)(1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},qa(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",Ga(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},m&&(p=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},u("AuthSessions.CurrentSession")),n.a.createElement(Oe.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},p.appName),n.a.createElement("span",{className:"subtitle black tight"},qa(p)),n.a.createElement("span",{className:"subtitle"},p.ip," - ",Ga(p)))),n.a.createElement(Oe.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),d&&(b=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},"Other Sessions"),b.map(h))),d&&n.a.createElement(Bt.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,p}));var $a=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(T.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2"},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,s){const o=Object(d.lb)(a),i=o?t[a]:void 0,m=o?void 0:e[a],u=Object(le.a)("Chat chat-item-clickable blocked-list-item",o?"private":"group");return n.a.createElement(Oe.a,{key:a,className:u,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(s+c)*l.h}px;`},n.a.createElement(q.a,{size:"medium",user:i,chat:m}),n.a.createElement("div",{className:"contact-info"},n.a.createElement("h3",null,Object(G.a)((o?Object(d.Z)(i):Object(d.l)(m))||"")),i&&i.phoneNumber&&n.a.createElement("div",{className:"contact-phone"},Object(Ut.c)(i.phoneNumber)),i&&!i.phoneNumber&&i.username&&n.a.createElement("div",{className:"contact-username"},"@",i.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results"},"List is empty"):n.a.createElement(ge.a,{key:"loading"}))),n.a.createElement(qt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),Ha=a(119);var Va=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},Object(G.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Oe.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(Oe.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(Oe.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),Wa=a(138),Ya=a(139);var Ka=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,m]=Object(n.r)(""),[d,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?m("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),m("")},[l]),p=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Wa.a,{isBig:!0,isPasswordVisible:d})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ya.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||p("Next"),clearError:b,isLoading:t,isPasswordVisible:d,onChangePasswordVisibility:u,onSubmit:h})))});var Za=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(U.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Qa=o.f?550:400;var _a=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(m.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const m=Object(n.q)(null),[d,u]=Object(n.r)(""),[h,b,p]=Object(Be.a)(!1);Object(n.n)(()=>{o.k||setTimeout(()=>{m.current.focus()},Qa)},[]);const g=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),m.current&&i(d)}},n.a.createElement(Ee.a,{ref:m,value:d,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),d?n.a.createElement(U.a,{type:"submit",isLoading:a,ripple:!0},g("Continue")):n.a.createElement(U.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},g("YourEmailSkip"))),s&&n.a.createElement(ve.a,{className:"narrow",isOpen:h,title:g("YourEmailSkipWarning"),onClose:p},Object(G.a)(g("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(U.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{p(),i()}},g("YourEmailSkip")),n.a.createElement(U.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:p},g("Cancel"))))))}));var Xa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(U.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const Ja=o.f?550:400;var en=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,m]=Object(n.r)("");Object(n.n)(()=>{o.k||setTimeout(()=>{l.current.focus()},Ja)},[]);const d=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{value:i,ref:l,inputMode:"decimal",label:d("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),m(a),e.target.value=a}}),a&&n.a.createElement(ge.a,null)))}));var tn=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:m,checkPassword:d,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:p})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const g=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),f=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),O=Object(n.m)(e=>{o({type:"setEmail",payload:e}),m({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,m]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),d({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[d,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),m({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,m]),N=Object(n.m)(e=>{p({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[p,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),d({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[d,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(T.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Za,{onStart:g});case s.m.TwoFaNewPassword:return n.a.createElement(Ka,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Ka,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(_a,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:f});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(_a,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:O});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(en,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(Xa,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Va,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Ka,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Ka,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(_a,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(_a,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(en,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var an=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:m})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),p=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[g,v]=Object(pe.a)(m,e,Boolean(a)),E=Object(T.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll"},t.map((e,a)=>n.a.createElement(Je.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(Oe.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(aa.a,{label:"",checked:t.includes(e)}),Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e})))):l||!g||g.length?n.a.createElement(ge.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function nn(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var cn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:nn(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:m,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,g]=Object(n.r)(""),[v,E]=Object(n.r)(!1),[f,O]=Object(n.r)(b),j=Object(n.p)(()=>{const e=l?Object(d.Ab)(r,l,o,"all"):void 0,t=i?Object(d.Ab)(r,i,m,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,m]),C=Object(n.p)(()=>{if(j)return j.filter(t=>(Object(d.lb)(t.id)&&t.id!==e||Object(d.kb)(t))&&(!p||Object(be.a)(Object(d.l)(t),p)||b.includes(t.id))).map(({id:e})=>e)},[j,e,p,b]),y=Object(n.m)(e=>{O(e),E(!0)},[]),k=Object(n.m)(()=>{u({privacyKey:Ua(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]),N=Object(T.a)();return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(an,{itemIds:C||[],selectedIds:f,filterValue:p,filterPlaceholder:N(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:y,onFilterChange:g}),n.a.createElement(qt,{isShown:v,onClick:k,ariaLabel:N(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(265);const rn=Object.keys(s.m).length/2;var sn=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a})=>{const[c,r]=Nt(At,Lt),[l,i]=Nt(Dt,Tt),m=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{r({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===c.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[c.mode,r,e,a,t]),d=Object(n.m)(()=>{r({type:"saveFilters"}),m()},[r,m]);function u(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(xt,{currentScreen:e,onReset:m,onSaveFilter:d,editedFolderId:c.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(Rt,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Yt,null);case s.m.General:return n.a.createElement(Ea,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Da,null);case s.m.Privacy:return n.a.createElement(Ba,{onScreenSelect:t});case s.m.Language:return n.a.createElement(xa,null);case s.m.GeneralChatBackground:return n.a.createElement(Pa,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(Ta,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement(za,null);case s.m.PrivacyBlockedUsers:return n.a.createElement($a,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(Ra,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(cn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(cn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(ra,{currentScreen:e,state:c,dispatch:r,onScreenSelect:t,onReset:m});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(tn,{currentScreen:e,state:l,dispatch:i,onScreenSelect:t});default:return}}())}return n.a.createElement(x.a,{id:"Settings",name:o.f?"slide-layers":"push-slide",activeKey:e,renderCount:rn},u)});const ln=Object(K.g)(e=>e(),6e4,!0);var on=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{ln(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(d.Z)(n);return c&&Object(be.a)(c,e)}):a;return Object(d.W)(n,t)},[e,t,a]),[i,m]=Object(pe.a)(void 0,l,Boolean(e));return n.a.createElement(fe.a,{items:i,onLoadMore:m,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.f},n.a.createElement(je.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(ge.a,{key:"loading"}))}));const mn=Object(K.g)(e=>e(),6e4,!0);var dn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{currentUserId:n}=e,{query:c,fetchingStatus:r,globalResults:s,localResults:l}=e.globalSearch,{users:o}=s||{},{users:i}=l||{};return{currentUserId:n,usersById:a,localContactIds:t,searchQuery:c,isSearching:r&&r.chats,globalUsers:o,localUsers:i}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,localContactIds:o,searchQuery:i,isSearching:m,localUsers:h,globalUsers:b,loadContactList:p,setGlobalSearchQuery:g})=>{Object(n.n)(()=>{mn(()=>{p()})});const v=Object(n.m)(e=>{g({query:e})},[g]),E=Object(n.p)(()=>{const e=o?o.filter(e=>e!==s):[];if(!i)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(d.Z)(t);return a&&Object(be.a)(a,i)});return Object(d.W)(Object(u.o)([...a,...h?h.map(e=>e.id):[],...b?b.map(e=>e.id):[]]),l,t)},[o,i,h,b,l,t,s]),f=Object(n.m)(()=>{t.length&&(g({query:""}),c())},[t,g,c]),O=Object(T.a)();return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,O("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(an,{itemIds:E,selectedIds:t,filterValue:i,filterPlaceholder:O("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:m,onSelectedIdsChange:a,onFilterChange:v}),n.a.createElement(qt,{isShown:Boolean(t.length),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var un=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(T.a)(),[m,d]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,p]=Object(n.r)(),[g,v]=Object(n.r)(),E=c===s.a.InProgress,f=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");d(a),a!==t&&(e.currentTarget.value=a)},[]),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{m.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:m,photo:b,memberIds:t}):v("Chat title can't be empty")},[m,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{m.length?o({title:m,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[m,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==g&&"Channel title can't be empty"!==g?g:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Gt.a,{onChange:p,title:i("AddPhoto")}),n.a.createElement(Ee.a,{value:m,onChange:f,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===g||"Channel title can't be empty"===g?g:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(Ee.a,{value:u,onChange:O,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:e}))))),n.a.createElement(qt,{isShown:0!==m.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(266);const hn=Object.keys(s.d).length/2;var bn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(x.a,{id:"NewChat",name:o.f?"slide-layers":"push-slide",renderCount:hn,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(dn,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(un,{isChannel:e,memberIds:r,onReset:c});default:return}})}),pn=a(177);a(267);var gn=Object(n.h)(({onReset:e})=>{const t=Object(T.a)();return n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:e,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,t("ArchivedChats"))),n.a.createElement(pn.a,{folderType:"archived",noChatsText:"Archive is empty."}))});const vn={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0},En=e=>{e.preventDefault()};function fn(e){vn[e.key]&&En(e)}function On(){document.addEventListener("wheel",En,{passive:!1}),window.ontouchmove=En,document.onkeydown=fn}function jn(){document.removeEventListener("wheel",En),window.ontouchmove=null,document.onkeydown=null}var Cn=a(48),yn=a(159);function kn(e,t){return e?"Copy Selected Text":t?"Copy Text":"Copy"}var Nn=a(163),In=a(47);a(268);var Sn=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:m,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:p,canCopy:g,canCopyLink:v,canSelect:E,onReply:f,onEdit:O,onPin:j,onUnpin:C,onForward:y,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:F,onCloseAnimationEnd:L,onCopyLink:A})=>{Object(n.n)(()=>{Object(k.b)(200)},[e]);const D=function(e,t,a){const n=[],c=Object(d.N)(e),s=Object(d.G)(e),l=Object(d.D)(e,"inline"),o=s&&l&&yn.a,i=window.getSelection();if(o&&n.push({label:"Copy Media",handler:()=>{Cn.b(l,r.ApiMediaFormat.BlobUrl).then(yn.b),t&&t()}}),c){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:kn(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(yn.c)(a),t&&t()}})}return a&&n.push({label:"CopyMessageLink",handler:()=>{a(),t&&t()}}),n}(t,F,v?A:void 0),B=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),x=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),U=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:R,positionY:G,style:q}=Object(Nn.a)(a,B,x,U,10,document.querySelector(".MiddleHeader").offsetHeight),z=Object(T.a)();return n.a.createElement(In.a,{isOpen:e,positionX:R,positionY:G,style:q,className:"MessageContextMenu fluid",onClose:F,onCloseAnimationEnd:L},c&&n.a.createElement(V.a,{icon:"send-outline",onClick:P},z("MessageScheduleSend")),s&&n.a.createElement(V.a,{icon:"schedule",onClick:M},z("MessageScheduleEditTime")),l&&n.a.createElement(V.a,{icon:"reply",onClick:f},z("Reply")),o&&n.a.createElement(V.a,{icon:"edit",onClick:O},z("Edit")),b&&n.a.createElement(V.a,{icon:"favorite",onClick:I},z("AddToFavorites")),p&&n.a.createElement(V.a,{icon:"favorite",onClick:S},z("Stickers.RemoveFromFavorites")),g&&D.map(e=>n.a.createElement(V.a,{key:e.label,icon:"copy",onClick:e.handler},z(e.label))),i&&n.a.createElement(V.a,{icon:"pin",onClick:j},z("DialogPin")),m&&n.a.createElement(V.a,{icon:"unpin",onClick:C},z("DialogUnpin")),h&&n.a.createElement(V.a,{icon:"forward",onClick:y},z("Forward")),E&&n.a.createElement(V.a,{icon:"select",onClick:w},z("Common.Select")),u&&n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:N},z("Delete")))};var wn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(m.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:d,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:p,canSelect:g}=n&&Object(m.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&d,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&p,canSelect:g}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:m,canReply:d,canPin:u,canUnpin:h,canDelete:b,canEdit:p,canForward:g,canFaveSticker:v,canUnfaveSticker:E,canCopy:f,canCopyLink:O,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(Q.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[D,B]=Object(n.r)(!1),[x,U]=Object(n.r)(!1),[G,q,z]=Object(Be.a)(),$=Object(n.m)(()=>{T(!1),B(!0)},[]),H=Object(n.m)(()=>{T(!1),s()},[s]),V=Object(n.m)(()=>{B(!1),s()},[s]),W=Object(n.m)(()=>{U(!1),s()},[s]),Y=Object(n.m)(()=>{z(),s()},[z,s]),K=Object(n.m)(()=>{C({messageId:a.id}),H()},[C,a.id,H]),Z=Object(n.m)(()=>{y({messageId:a.id}),H()},[y,a.id,H]),_=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),H()},[k,a.id,H]),J=Object(n.m)(()=>{if(H(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,H,c]),ee=Object(n.m)(()=>{H(),I({sticker:a.content.sticker})},[H,a.content.sticker,I]),te=Object(n.m)(()=>{H(),S({sticker:a.content.sticker})},[H,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),H()},[H,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),H()},[H,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),H()},[H,F,a.chatId,a.id]);if(Object(n.n)(()=>(On(),jn),[]),o)return void H();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(Sn,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:m,canReply:d,canDelete:b,canPin:u,canUnpin:h,canEdit:p,canForward:g,canFaveSticker:v,canUnfaveSticker:E,canCopy:f,canCopyLink:O,canSelect:j,onReply:K,onEdit:Z,onPin:_,onUnpin:X,onForward:J,onDelete:$,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:H,onCopyLink:se}),n.a.createElement(Ae,{isOpen:D,isSchedule:"scheduled"===t,onClose:V,album:c,message:a}),n.a.createElement(Te,{isOpen:x,messageId:a.id,chatId:a.chatId,onClose:W}),n.a.createElement(Le,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(R.k)(le),isFutureMode:!0,onClose:Y,onSubmit:re}))}));a(269);var Pn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(m.ub)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),{observe:m}=Object(sa.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const d=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),u=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(ve.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title:"Sticker Set"},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(ha,{sticker:e,size:l.qb,observeIntersection:m,onClick:d,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(U.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:u},`${a.installedDate?"Remove":"Add"} ${a.count} stickers`))):n.a.createElement(ge.a,null))})),Mn=a(114);a(270);var Fn=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(d.lb)(a.id),canDeleteChat:Object(d.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:m,chat:d,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:p,onSearchClick:g,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:f,enterMessageSelectMode:O})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(Q.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{f({chatId:e,isMuted:!h}),w()},[e,w,h,f]),F=Object(n.m)(()=>{p(),w()},[w,p]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{O(),w()},[w,O]);Object(n.n)(()=>(On(),jn),[]);const D=Object(T.a)();return n.a.createElement(Mn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(In.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.f&&r&&n.a.createElement(V.a,{icon:c?"channel":"group",onClick:F},D(c?"Subscribe":"Join Group")),o.f&&s&&n.a.createElement(V.a,{icon:"search",onClick:L},D("Search")),l&&n.a.createElement(V.a,{icon:h?"unmute":"mute",onClick:M},D(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(V.a,{icon:"select",onClick:A},D("ReportSelectMessages")),m&&n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:S},D(u?"Delete":b?"Delete and Leave":"Leave"))),d&&n.a.createElement($e.a,{isOpen:y,onClose:P,chat:d})))})),Ln=a(143);a(271);const An=Object(K.a)(e=>e(),200,!1);var Tn=Object(n.h)(Object(c.h)(e=>{const t=Object(m.r)(e);if(!t)return{};const{query:a,results:n}=Object(m.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","searchMessagesByDate"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,setLocalTextSearchQuery:s,searchTextMessagesLocal:l,focusMessage:o,closeLocalTextSearch:i,searchMessagesByDate:m})=>{const d=Object(n.q)(null),[u,h]=Object(n.r)(0),[b,p,g]=Object(Be.a)();Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===d.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&r&&r.length?(o({chatId:t.id,messageId:r[r.length-1]}),h(0)):h(-1)},[t,o,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==d.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||d.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[b]);const v=Object(n.m)(e=>{s({query:e}),e.length&&An(l)},[l,s]),E=Object(n.m)(e=>{m({timestamp:e.valueOf()/1e3}),g()},[g,m]),f=Object(n.m)(()=>{if(t&&r){const e=u+1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),O=Object(n.m)(()=>{if(t&&r){const e=u-1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),j=Object(T.a)();return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{size:"smaller",round:!0,color:"translucent",onClick:i},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Ln.a,{ref:d,value:a,onChange:v})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${u+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:p,ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:f,disabled:!r||!r.length||u===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:O,disabled:!r||!r.length||0===u},n.a.createElement("i",{className:"icon-down"}))),n.a.createElement(Le,{isOpen:b,isPastMode:!0,submitButtonLabel:j("JumpToDate"),onClose:g,onSubmit:E}))})),Dn=a(53),Bn=a(179),xn=a(168),Un=a(172);var Rn=function(e,t){const a=e.scrollTop,n=a+e.offsetHeight,c=t.offsetTop,r=c+t.offsetHeight;return c>a&&r{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(Q.a)(e,void 0,void 0,!1),m=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(qn.a)(t,e)},[s]),[d,u]=Object(n.r)(-1),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>m(t+e))},[u,m]),b=Object(n.m)((e,t=!1)=>{const a=r&&r[e];a&&c(a,t)},[r,c]),p=Object(n.m)(e=>{if(s&&s.length&&d>-1){const t=s[d];t&&(e.preventDefault(),b(t.userId,!0))}},[s,d,b]);Object(n.n)(()=>e?Object(xe.a)({onEsc:a,onUp:e=>h(-1,e),onDown:e=>h(1,e),onEnter:p,onTab:p}):void 0,[e,a,h,p]),Object(n.n)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=function(e,t,a=0,n=!1,c=!1){const r=e.scrollTop,s=r+e.offsetHeight,l="string"==typeof t?e.querySelectorAll(t):t,{length:o}=l,i=[];let m=!1;for(let e=0;e=r-a&&d<=s+a:o<=s+a&&d>=r-a)i.push(e),m=!0;else if(m&&!n)break}return{allElements:l,visibleIndexes:i}}(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Rn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object(Gn.a)(a,c[e],t,10)}}(d,l)},[d]);const g=Object(y.a)(s&&s.length?s:void 0,o),v=s&&!s.length?g:s;if(!o||v&&!v.length)return;const E=Object(le.a)("MentionMenu custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:d===t},n.a.createElement(je.a,{userId:e,avatarSize:"small",withHandle:!0}))))});a(273);var $n=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,onCaptionUpdate:o,onSend:i,onClear:m})=>{const d=Object(y.a)(e),u=e.length?e:d,h=Boolean(e.length),{isMentionMenuOpen:p,mentionFilter:g,closeMentionMenu:v,insertMention:E,mentionFilteredMembers:f}=Object(Bn.a)(a&&h,t,o,l.v,c,r,s);Object(n.n)(()=>h?Object(b.a)(m):void 0,[h,m]);const O=Object(n.m)(()=>{h&&i()},[h,i]),j=Object(T.a)();if(!u)return;const C=u.every(e=>e.mimeType.startsWith("image/")),k=u.every(e=>e.mimeType.startsWith("video/"));let N="";N=C?1===u.length?"Send Photo":`Send ${u.length} Photos`:k?1===u.length?"Send Video":`Send ${u.length} Videos`:1===u.length?"Send File":`Send ${u.length} Files`;const I=u.every(e=>e.quick);return n.a.createElement(ve.a,{isOpen:h,onClose:m,header:function(){if(u)return n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:m},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},N),n.a.createElement(U.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:O},j("Send")))}(),className:"AttachmentModal"},I?n.a.createElement("div",{className:"media-wrapper custom-scroll"},u.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},u.map(e=>n.a.createElement(xn.a,{name:e.filename,extension:Object(Dn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(zn,{isOpen:p,onClose:v,filter:g,onInsertUserName:E,filteredChatMembers:f,usersById:s}),n.a.createElement(Un.a,{id:"caption-input-text",html:t,editableInputId:l.v,placeholder:j("Caption"),onUpdate:o,onSend:i,shouldSetFocus:h})))}),Hn=a(123);a(274);var Vn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,m]=Object(n.r)([""]),[d,u]=Object(n.r)(!0),[h,p]=Object(n.r)(!1),[g,v]=Object(n.r)(!1),[E,f]=Object(n.r)(),[O,j]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),m([""]),u(!0),p(!1),v(!1),f(""),j(""),y(!1))},[e]),Object(n.n)(()=>k(c),[k,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const N=Object(n.m)((e=[])=>{m([...e,""]),requestAnimationFrame(()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),I=Object(n.m)(()=>{if(y(!1),!e)return;const a=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?N(n):m(n):N(),void y(!0);if(g&&(!O||!n[Number(O)]))return void y(!0);const c={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===O&&{correct:!0}})),...!d&&{isPublic:!0},...h&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=E&&Object(Hn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[O],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,g,O,d,h,t,N,E]),S=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?N(a):m(a)},[i,N]),w=Object(n.m)(e=>{const t=[...i];t.splice(e,1),m(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),P=Object(n.m)(e=>{j(e)},[j]),M=Object(n.m)(e=>{u(e.target.checked)},[]),F=Object(n.m)(e=>{p(e.target.checked)},[]),L=Object(n.m)(e=>{v(e.target.checked)},[]),A=Object(n.m)(e=>{13===e.keyCode&&I()},[I]),D=Object(n.m)(()=>{if(C&&!l.trim().length)return"Please enter the question"},[C,l]),B=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return"Please enter at least two options"},[C,i]),x=Object(T.a)();function R(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(Ee.a,{label:t!==i.length-1||10===i.length?"Option "+(t+1):"Add an Option",error:B(t),value:e,onChange:e=>S(t,e.currentTarget.value),onKeyPress:A}),t!==i.length-1&&n.a.createElement(U.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:"Remove option",onClick:()=>w(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(ve.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},x("NewPoll")),n.a.createElement(U.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:I},x("Create"))),className:"PollModal"},n.a.createElement(Ee.a,{ref:c,label:x("AskAQuestion"),value:l,error:D(),onChange:e=>o(e.currentTarget.value),onKeyPress:A}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return g&&(!O||!e[Number(O)])&&n.a.createElement("p",{className:"error"},"Please choose the correct answer")}(),g?n.a.createElement(oa.a,{name:"correctOption",options:R().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:P}):R()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(aa.a,{label:x("PollAnonymous"),checked:d,onChange:M}),n.a.createElement(aa.a,{label:x("PollMultiple"),checked:h,disabled:g,onChange:F}),n.a.createElement(aa.a,{label:x("PollQuiz"),checked:g,disabled:h,onChange:L}),g&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,onChange:e=>f(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},"Users will see this comment after choosing a wrong answer, good for educational purposes."))))});let Wn;function Yn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Wn&&(clearTimeout(Wn),Wn=void 0),e&&!o.k&&(Wn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Wn&&(clearTimeout(Wn),Wn=void 0),Wn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Kn=a(67),Zn=a(144);a(275);var Qn=Object(n.h)(({emoji:e,onClick:t})=>{const a=Object(n.m)(()=>{t(e.native,e.id)},[e,t]);return n.a.createElement("div",{className:"EmojiButton",onClick:a,title:e.colons},o.c?e.native:n.a.createElement("img",{src:`/img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var _n=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(sa.c)(l,c);const{transitionClassNames:i}=Object(Q.a)(r,void 0,void 0,"slow"),m=Object(T.a)(),d=o.f?Math.floor((I.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/d);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},m("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(le.a)("symbol-set-container",i),style:`height: ${u}px;`},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(Qn,{key:c.id,emoji:c,onClick:s})})))});a(276);const Xn={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},Jn=[];let ec,tc,ac;var nc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]),(e,t)=>Object(u.l)(t,["addRecentEmoji"]))(({className:e,onEmojiSelect:t,recentEmojis:c,addRecentEmoji:r})=>{const s=Object(n.q)(null),i=Object(n.q)(null),[m,d]=Object(n.r)(),[u,h]=Object(n.r)(),[b,p]=Object(n.r)(0),{observe:g}=Object(sa.a)({rootRef:s,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));Jn[a]=e.isIntersecting});const t=Jn.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&p(t[Math.floor(t.length/2)].index)});Object(Ve.a)(i,!o.f),Object(n.n)(()=>{if(!m)return;const e=i.current;if(!e)return;const t=42*b-e.offsetWidth/2+21;Object(Zn.a)(e,t)},[m,b]);const v=Object(T.a)(),E=Object(n.p)(()=>{if(!m)return qe.a;const e=[...m];return c&&c.length&&e.unshift({id:"recent",name:v("RecentStickers"),emojis:c}),e},[m,v,c]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(ac.categories),h(ac.emojis)};ac?e():async function(){ec||(ec=a.e(9).then(a.t.bind(null,305,3)),tc=(await ec).default,ac=Object(Kn.b)(tc));return ec}().then(e)},200)},[]);const f=Object(n.m)(e=>{p(e);const t=document.getElementById("emoji-category-"+e);Object(Gn.a)(s.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e),r({emoji:a})},[r,t]),j=Object(ot.a)([],l.P);const C=Object(le.a)("EmojiPicker",e);return u&&j?n.a.createElement("div",{className:C},n.a.createElement("div",{ref:i,className:"EmojiPicker-header"},E.map((function(e,t){const a=Xn[e.id];return a&&n.a.createElement(U.a,{className:"symbol-set-button "+(t===b?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>f(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:s,className:"EmojiPicker-main no-selection no-scrollbar"},E.map((e,t)=>n.a.createElement(_n,{category:e,index:t,allEmojis:u,observeIntersection:g,shouldRender:b>=t-1&&b<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:C},n.a.createElement(ge.a,null))}));const cc=o.f?8:16;var rc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const m=Object(n.q)(null);Object(sa.c)(m,c);const{transitionClassNames:d}=Object(Q.a)(r,void 0,void 0,"slow"),u=o.f?Math.floor((I.a.get().width-8)/(l.rb+cc)):5,h=Math.ceil(e.count/u)*(l.rb+cc);return n.a.createElement("div",{ref:m,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(le.a)("symbol-set-container",d),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(ha,{key:a.id,sticker:a,size:l.rb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(277);const sc=[];var lc=Object(n.h)(Object(c.h)(e=>{const{setsById:t,added:a,recent:n,favorite:c}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:c.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:m,loadStickerSets:d,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:p,unfaveSticker:g})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[f,O]=Object(n.r)(0),{observe:j}=Object(sa.a)({rootRef:v,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));sc[a]=e.isIntersecting});const t=sc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&O(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(sa.a)({rootRef:E}),y=Object(T.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:qe.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(d(),u(),h())},[t,h,u,d]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(Ve.a)(E),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*f-(e.offsetWidth/2-26);Object(Zn.a)(e,t)},[k,f]);const S=Object(n.m)(e=>{O(e);const t=document.getElementById("sticker-set-"+e);Object(Gn.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{m(e),p({sticker:e})},[p,m]),P=Object(n.m)(e=>{g({sticker:e})},[g]),M=Object(ot.a)([],l.ib);const F=Object(le.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:F},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(le.a)("symbol-set-button sticker-set-button",t===f&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(U.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>S(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(da,{stickerSet:e,observeIntersection:C}):n.a.createElement(ua,{stickerSet:e,observeIntersection:C})):n.a.createElement(ha,{key:e.id,sticker:a,size:l.sb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(rc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:f>=a-1&&f<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:F},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(278);function oc(){return(oc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o="gif"+e.id,i=Object(sa.b)(s,t)&&!a,m=Object(v.a)(o+"?size=m",!i,r.ApiMediaFormat.BlobUrl),d=Object(j.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),u=m||d,h=Object(v.a)(o,!i,r.ApiMediaFormat.BlobUrl),b=Boolean(i&&h),{transitionClassNames:p}=Object(ia.a)(u||h,"slow"),{isBuffered:g,bufferingHandlers:E}=Object(_.a)(!0),f=i&&!g;Object(J.a)(l,[b]);const O=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),C=Object(le.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(sa.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const m=Object(ot.a)([],l.ib);return n.a.createElement("div",{ref:o,className:Object(le.a)("GifPicker no-scrollbar",e)},a?m&&c&&c.length?c.map(e=>n.a.createElement(ic,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):m&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let dc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(dc||(dc={}));const uc=Object.values(dc).filter(e=>"string"==typeof e),hc={[dc.Emoji]:"icon-smile",[dc.Stickers]:"icon-stickers",[dc.GIFs]:"icon-gifs"};var bc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{function r(a){return n.a.createElement(U.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:uc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:hc[a]}))}const s=Object(n.m)(()=>{c(e===dc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()}},e!==dc.Emoji&&n.a.createElement(U.a,{className:"symbol-search-button",ariaLabel:e===dc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:s},n.a.createElement("i",{className:"icon-search"})),r(dc.Emoji),r(dc.Stickers),r(dc.GIFs),e===dc.Emoji&&n.a.createElement(U.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(280);let pc=!1;var gc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:m})=>{const[d,u]=Object(n.r)(0),[h,b]=Yn(e,c),{shouldRender:p,transitionClassNames:g}=Object(Q.a)(e,c,!1,!1);!pc&&e&&(pc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.f)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(K.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const v=Object(n.m)(e=>{c(),m(e)},[c,m]),E=Object(T.a)(),{canSendStickers:f,canSendGifs:O}=t;function j(t,a){switch(d){case dc.Emoji:return n.a.createElement(nc,{className:"picker-tab",onEmojiSelect:r});case dc.Stickers:return n.a.createElement(lc,{className:"picker-tab",loadAndPlay:!!f&&(e&&(t||a)),canSendStickers:f,onStickerSelect:s});case dc.GIFs:return n.a.createElement(mc,{className:"picker-tab",loadAndPlay:!!O&&(e&&(t||a)),canSendGifs:O,onGifSelect:l})}}const C=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},pc&&n.a.createElement(x.a,{name:"slide",activeKey:d,renderCount:uc.length},j)),o.f&&n.a.createElement(U.a,{round:!0,faded:!0,color:"translucent",ariaLabel:E("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(bc,{activeTab:d,onSwitchTab:u,onRemoveSymbol:i,onSearchOpen:v}));if(o.f){if(!p)return;const e=Object(le.a)("SymbolMenu mobile-menu",g);return n.a.createElement(Mn.a,null,n.a.createElement("div",{className:e},C))}return n.a.createElement(In.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.k?void 0:h,onMouseLeave:o.k?void 0:b,noCloseOnBackdrop:!o.k},C)});a(281);var vc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Yn(e,r),m=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),d=Object(n.m)(()=>{Oa(l.k,e=>m(e,!0))},[m]),u=Object(n.m)(()=>{Oa("*",e=>m(e,!1))},[m]),h=Object(T.a)(),{canAttachMedia:b,canAttachPolls:p}=t;return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.k?void 0:s,onMouseLeave:o.k?void 0:i,noCloseOnBackdrop:!o.k},!b&&n.a.createElement(V.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),b&&n.a.createElement(n.a.Fragment,null,n.a.createElement(V.a,{icon:"photo",onClick:d},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(V.a,{icon:"document",onClick:u},"Document")),p&&n.a.createElement(V.a,{icon:"poll",onClick:c},h("Poll")))});a(282);var Ec=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(Q.a)(e,void 0,void 0,!1),m=Object(y.a)(a,!0),d=a||m,{observe:u}=Object(sa.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(le.a)("EmojiTooltip custom-scroll",i);return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.k?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.k?void 0:()=>{document.body.classList.remove("no-select")}},s&&d?d.map(e=>n.a.createElement(ha,{key:e.id,sticker:e,size:l.rb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(ge.a,null):void 0)}));a(283);var fc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(m.y)(e)||{};return a?{message:Object(m.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Yn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.k?void 0:r,onMouseLeave:o.k?void 0:s,noCloseOnBackdrop:!o.k},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(U.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(284);var Oc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Yn(e,c),i=Object(T.a)();return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.k?void 0:s,onMouseLeave:o.k?void 0:l,noCloseOnBackdrop:!o.k},t&&n.a.createElement(V.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(V.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),jc=a(124),Cc=a(153),yc=a(161);a(285);var kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),n=a&&Object(m.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(m.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return qe.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(m.Db)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(d.jb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(m.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(m.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]);return n.a.createElement(fe.a,{className:"RightSearch custom-scroll",items:b,preloadBackwards:0,onLoadMore:i,noFastList:!0},n.a.createElement("p",{className:"helper-text"},s?1===l?"1 message found":(b.length&&(l||b.length)||"No")+" messages found":"Search messages"),b.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(d.l)(a):Object(d.Z)(t),l=Object(d.M)(e);return n.a.createElement(Oe.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(q.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",null,r&&Object(G.a)(r)),n.a.createElement(yc.a,{message:e})),n.a.createElement("div",{className:"subtitle"},Object(G.a)(l,["emoji","highlight"],{highlight:s}))))}))}));var Nc=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(m.ub)(e,t),shouldPlay:Object(m.tb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const m=a&&Boolean(a.installedDate),d=Boolean(a&&a.stickers),[u,h,b]=Object(Be.a)();Object(O.a)(()=>{i(u)},[u,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!d&&p.length<5&&r({stickerSetId:e})},[d,p.length,r,e]);const g=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const v=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set"},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title"},a.title),n.a.createElement("p",{className:"count"},a.count," stickers")),n.a.createElement(U.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:g},m?"Added":"Add")),n.a.createElement("div",{className:"sticker-set-main"},!v&&n.a.createElement(D.a,null),v&&p.map(e=>n.a.createElement(ha,{sticker:e,size:l.tb,observeIntersection:t,noAnimate:!c||u||o,onClick:h}))),v&&n.a.createElement(pa.a,{isOpen:u,fromSticker:p[0],onClose:b}))}));a(286);const Ic=Object(K.g)(e=>e(),6e4,!0);var Sc=Object(n.h)(Object(c.h)(e=>{const t=Object(m.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),[s,l]=Object(n.r)(!1),{observe:o}=Object(sa.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Ic(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll"},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Nc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):a?a.length?a.map(e=>n.a.createElement(Nc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):n.a.createElement("p",{className:"helper-text"},"Nothing found."):n.a.createElement(ge.a,null)}())}));a(287);var wc=Object(n.h)(Object(c.h)(e=>{const t=Object(m.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(m.y)(e)||{},r=c?Object(m.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(m.N)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:m}=Object(sa.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(d.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.k&&l({query:void 0})},[u,s,l]),b=Object(T.a)();const p=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch"},n.a.createElement(fe.a,{ref:i,className:Object(le.a)("gif-container custom-scroll",p&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(ic,{key:e.id,gif:e,observeIntersection:m,onClick:h})):n.a.createElement("p",{className:"helper-text"},b("NoGIFsFound")):n.a.createElement(ge.a,null)}()))}));a(288);let Pc,Mc;function Fc(e){return fetch(e).then(e=>e.json())}function Lc(e,t){const a=new Date(t),n=a.getMonth()+1,c=a.getDate();return Fc(`${e}/${`${a.getFullYear()}-${n<10?"0":""}${n}/${c<10?"0":""}${c}`}.json`)}var Ac=Object(n.h)(()=>{const e=Object(n.q)(null),[t,c]=Object(n.r)(!1),[r,s]=Object(n.r)(0);return Object(n.n)(()=>{(async()=>{if(await async function(){return Pc||(Pc=a.e(6).then(a.bind(null,306)),Mc=await Pc),Pc}(),!t)return void c(!0);const n=await Fc("./chartDummyData/growth.json");Mc.create(e.current.children[0],n),s(1);const r=await Fc("./chartDummyData/notifications.json");r.onZoom=e=>Lc("chartDummyData/notifications_zoom",e),Mc.create(e.current.children[1],r),s(2);const l=await Fc("./chartDummyData/interactions.json");Mc.create(e.current.children[2],l),s(3);const o=await Fc("./chartDummyData/views.json");o.onZoom=e=>Lc("chartDummyData/views_zoom",e),Mc.create(e.current.children[3],o),s(4);const i=await Fc("./chartDummyData/languages.json");Mc.create(e.current.children[4],i),s(5)})()},[t]),n.a.createElement("div",{className:Object(le.a)("Statistics custom-scroll",t&&"ready"),ref:e},t?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:Object(le.a)("chat-container",r<1&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<2&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<3&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<4&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<5&&"hidden")})):n.a.createElement(ge.a,null))});a(289);var Tc=Object(n.h)(Object(c.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:m})=>{const d=Object(y.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:p,text:g}=a;Object(n.n)(()=>{b&&d===c.votersCount||o({chat:e,messageId:t.id,option:p,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const v=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:p,offset:l,limit:50})},[e,o,t.id,l,p]);Object(n.n)(()=>{h(!1)},[s]);const E=Object(n.m)(e=>{i({id:e}),m()},[m,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},s?s.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},n.a.createElement(je.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(ge.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Xt,{count:e,itemName:"voter",isLoading:u,onClick:v})}()),n.a.createElement("div",{className:"answer-head"},n.a.createElement("span",{className:"answer-title"},g),n.a.createElement("span",{className:"answer-percent"},(f=c.votersCount,(O=r)>0?(f/O*100).toFixed():0),"%")));var f,O}));a(290);var Dc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(m.f)(e,t),message:Object(m.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{if(!t||!e)return n.a.createElement(ge.a,null);const{summary:c,results:r}=Object(d.H)(t);if(!r.results)return;const s=Object(u.c)(r.results,"option");return n.a.createElement("div",{className:"PollResults"},n.a.createElement("h3",{className:"poll-question"},c.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&c.answers.map(a=>n.a.createElement(Tc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:s[a.option],totalVoters:r.totalVoters})),!a&&n.a.createElement(ge.a,null)))}));a(155);var Bc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(m.Db)(e,t),n=Object(m.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:m})=>{const[d,u,h]=Object(Be.a)(),[b,p]=Object(n.r)(!1),[g,v]=Object(n.r)(),E=Object(T.a)(),f=t&&t.firstName||"",O=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(f),[k,N]=Object(n.r)(O),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{p(!1),h()},[h,e]),Object(n.n)(()=>{y(f),N(O)},[f,O,t]),Object(n.n)(()=>{c===s.f.Complete&&(p(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),p(!0)},[]),F=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),L=Object(n.m)(()=>{a.lastMessage&&o({chatId:a.id,maxId:a.lastMessage.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),m({id:void 0})},[a.id,a.lastMessage,h,i,o,l,m,e]);if(!t)return;const A=c===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(je.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withMediaViewer:!0,withFullInfo:!0}),n.a.createElement(Ee.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===g?g:void 0}),n.a.createElement(Ee.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(qt,{isShown:b,onClick:F,disabled:A,ariaLabel:E("Save")},A?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:d,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:L,confirmIsDestructive:!0}))}));var xc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(d.ib)(a),hasLinkedChannel:c,canChangeInfo:Object(d.q)(a,"changeInfo"),canBanUsers:Object(d.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:m,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:p,deleteChannel:g,closeManagement:E,openChat:f})=>{const[O,j,C]=Object(Be.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[F,L]=Object(n.r)(),[A,B]=Object(n.r)(),x=Object(d.f)(t),U=Object(v.a)(x,!1,r.ApiMediaFormat.BlobUrl),R=Object(T.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),B(void 0))},[a]);const q=Object(n.m)(()=>{m(s.g.ChatPrivacyType)},[m]),z=Object(n.m)(()=>{m(s.g.Discussion)},[m]),$=Object(n.m)(()=>{m(s.g.GroupPermissions)},[m]),H=Object(n.m)(()=>{m(s.g.ChatAdministrators)},[m]),V=Object(n.m)(e=>{L(e),I(!0)},[]),W=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),Y=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:F}):B("Group title can't be empty")},[P,e,F,S,h]),Z=Object(n.m)(()=>{m(s.g.GroupMembers)},[m]),Q=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),_=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):t.isCreator?g({chatId:t.id}):p({chatId:t.id}),C(),E(),f({id:void 0})},[c,t.isCreator,t.id,t.lastMessage,C,E,b,p,g,f]);if(t.isRestricted)return;const ee=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:U,onChange:V,disabled:!o}),n.a.createElement(Ee.a,{id:"group-title",label:R("GroupName"),onChange:W,value:S,error:"Group title can't be empty"===A?A:void 0,disabled:!o}),n.a.createElement(Ee.a,{id:"group-about",className:"mb-2",label:R("DescriptionPlaceholder"),onChange:Y,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Oe.a,{icon:"lock",ripple:!0,onClick:q},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?R("TypePublic"):R("TypePrivate")))),l&&n.a.createElement(Oe.a,{icon:"message",ripple:!0,onClick:z},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},R("DiscussionUnlink")))),n.a.createElement(Oe.a,{icon:"permissions",ripple:!0,onClick:$,disabled:!i},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("ChannelPermissions")),n.a.createElement("span",{className:"subtitle"},_,"/",8))),n.a.createElement(Oe.a,{icon:"admin",ripple:!0,onClick:H},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(ma.a)(X))))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"group",ripple:!0,onClick:Z},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(ma.a)(t.membersCount)))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(aa.a,{checked:!t.fullInfo.isPreHistoryHidden,label:R("ChatHistory"),onChange:Q,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},R("DeleteMega")))),n.a.createElement(qt,{isShown:N,onClick:K,disabled:ee,ariaLabel:R("Save")},ee?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:O,onClose:C,textParts:Object(G.a)(c||!t.isCreator?R("AreYouSureDeleteAndExit"):R("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?R("DeleteMega"):R("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var Uc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),h=Object(T.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),p=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),g=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),m(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),m(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const c=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!c)return e;const r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete-user",ripple:!0,narrow:!0,onClick:b},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},f)))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},h("PrivacyExceptions")),n.a.createElement(Oe.a,{icon:"add-user",ripple:!0,onClick:p},h("ChannelAddException")),O.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>g(e)},n.a.createElement(je.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(qt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:d},d?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var Rc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(T.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(d.Z)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(je.a,{userId:e.userId,status:s(e)}))))))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(d.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:m,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:p})=>{const g=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",f=t&&t.fullInfo&&t.fullInfo.linkedChatId,[O,j,C]=Object(Be.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(g),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[F,L]=Object(n.r)(),A=t&&Object(d.f)(t),B=Object(v.a)(A,!1,r.ApiMediaFormat.BlobUrl),x=Object(T.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),L(void 0))},[a]);const U=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,R=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),$=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),H=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),V=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):L("Channel title can't be empty")},[S,e,P,N,i]),W=Object(n.m)(()=>{m({chatId:e,isEnabled:!c})},[e,c,m]),Y=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),K=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),p({id:void 0})},[t.isCreator,t.id,C,u,h,b,p]);if(t.isRestricted)return;const Z=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:B,onChange:z,disabled:!l}),n.a.createElement(Ee.a,{id:"channel-title",label:x("EnterChannelName"),onChange:$,value:N,error:"Channel title can't be empty"===F?F:void 0,disabled:!l}),n.a.createElement(Ee.a,{id:"channel-about",className:"mb-2",label:x("DescriptionPlaceholder"),onChange:H,value:S,disabled:!l}),t.isCreator&&n.a.createElement(Oe.a,{icon:"lock",ripple:!0,onClick:R},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?x("TypePublic"):x("TypePrivate")))),n.a.createElement(Oe.a,{icon:"message",ripple:!0,onClick:G,disabled:!l},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("Discussion")),n.a.createElement("span",{className:"subtitle"},x(f?"DiscussionUnlink":"Add")))),n.a.createElement(Oe.a,{icon:"admin",ripple:!0,onClick:q},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},U))),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:c,label:x("ChannelSignMessages"),onChange:W}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"group",ripple:!0,onClick:Y},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle"},x("Subscribers",t.membersCount,"i"))))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?x("ChannelDelete"):x("LeaveChannel")))),n.a.createElement(qt,{isShown:y,onClick:V,disabled:Z,ariaLabel:x("Save")},Z?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:O,onClose:C,text:t.isCreator?x("ChannelDeleteAlert"):x("ChannelLeaveAlert"),confirmLabel:t.isCreator?x("ChannelDelete"):x("LeaveChannel"),confirmHandler:K,confirmIsDestructive:!0}))})),qc=a(51);var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{isUsernameAvailable:n}=Object(m.Y)(e,t);return{chat:a,isChannel:Object(d.jb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),m=e.fullInfo&&e.fullInfo.inviteLink,[d,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[p,g,v]=Object(Be.a)(),E="public"===d&&h&&c||"private"===d&&i;Object(n.n)(()=>{d&&!m&&o()},[d,m,o]);const f=Object(n.m)(e=>{u(e)},[]),O=Object(n.m)(()=>{l({username:"public"===d?h:""})},[d,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(T.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(oa.a,{selected:d,name:"channel-type",options:N,onChange:f})),"private"===d?n.a.createElement("div",{className:"section"},m?n.a.createElement(n.a.Fragment,null,n.a.createElement(qc.a,{url:m,className:"group-link",text:m}),n.a.createElement("p",{className:"section-info"},C(y+"PrivateLinkHelp")),n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:g},C("RevokeLink")),n.a.createElement(Bt.a,{isOpen:p,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(ge.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Vt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(qt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:O},I?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var $c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(m.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(d.jb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:m,linkDiscussionGroup:d,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[p,g]=Object(n.r)(),[v,E]=Object(n.r)(!1),f=Object(n.m)(()=>E(!0),[]),[O,j,C]=Object(Be.a)(),[y,k,N]=Object(Be.a)(),I=Object(T.a)(),S=c&&c.id;Object(n.n)(()=>{m()},[m]),Object(n.n)(()=>{p||Object(Kt.a)("DiscussionGroups").then(g)},[p]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),d({channelId:t,chatId:h})},[N,d,t,h]);function M(){const e=a[h];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(q.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function F(){const t=a[h];if(t)return t.hasPrivateLink?Object(G.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(G.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},p&&n.a.createElement(Zt.a,{id:"discussionGroupsDucks",size:l.lb,animationData:p,play:v,noLoop:!0,onLoad:f})),c&&n.a.createElement("div",null,n.a.createElement(Oe.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(Ce.a,{chatId:c.id})),n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(Bt.a,{isOpen:O,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(q.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(G.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Oe.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),r?r.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(Ce.a,{chatId:e}))):n.a.createElement(Xe.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help"},I("DiscussionChannelHelp2")),n.a.createElement(Bt.a,{isOpen:y,onClose:N,header:M(),textParts:F(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Hc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),[h,b,p]=Object(Be.a)(),g=Object(T.a)(),v=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),m(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),m(!0)},[]),f=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),O=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4"},g("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:g("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:g("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:g("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:g("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:g("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:g("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:g("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:g("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},g("UserRestrictionsBlock")))),n.a.createElement(qt,{isShown:i,onClick:f,ariaLabel:g("Save"),disabled:d},d?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:h,onClose:p,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:O,confirmIsDestructive:!0}))}));var Vc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(d.jb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(T.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),m=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(d.Z)(t)):o("ChannelAdmin")},[o,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"recent",ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail"))))),n.a.createElement("div",{className:"section"},n.a.createElement("p",{className:"text-muted"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),i.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>m(e)},n.a.createElement(je.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.f)(e,t)}))(({chat:e})=>{const t=Object(T.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},"Admins"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(aa.a,{label:"",checked:!0}),n.a.createElement(je.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(d.jb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[m,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[p,g]=Object(n.r)(!1),[v,E,f]=Object(Be.a)(),[O,j]=Object(n.r)(""),C=Object(T.a)(),y=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),g(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(g(!0),i({chatId:a.id,userId:e,adminRights:m,customTitle:O}))},[a,e,m,O,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),f())},[a.id,f,e,i]),S=Object(n.m)(e=>!Object(d.ib)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(d.Z)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!!m.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"postMessages",checked:!!m.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"editMessages",checked:!!m.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"deleteMessages",checked:!!m.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"banUsers",checked:!!m.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!!m.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!!m.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"addAdmins",checked:!!m.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"anonymous",checked:!!m.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(Ee.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:O,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(qt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:p},p?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:v,onClose:f,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(d.jb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(d.W)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(d.jb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(d.W)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>o(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Qc=Object(n.h)(Object(c.h)(e=>({managementType:Object(m.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(Bc,{key:e,userId:e});case"group":return n.a.createElement(xc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(Gc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(zc,{chatId:e});case s.g.Discussion:return n.a.createElement($c,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(Uc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(Rc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Zc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Hc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(Vc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Wc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Yc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Kc,{chatId:e})}}));const _c={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function Xc(e){return e&&_c[e]||""}const Jc=/^4[0-9]{12}(?:[0-9]{1,3})?$/,er=/^5[1-5][0-9]{11,14}$/,tr=/^2[2-7][0-9]{11,14}$/;let ar;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(ar||(ar={}));const nr={[ar.Default]:"",[ar.Visa]:"visa",[ar.Mastercard]:"mastercard"};function cr(e){return e=e.replace(/\s/g,""),Jc.test(e)?ar.Visa:er.test(e)||tr.test(e)?ar.Mastercard:ar.Default}var rr=a(54);const sr={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},lr=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:or(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:or(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function or(e){const t=Ut.a.find(({id:t})=>t===e);return t?t.name:""}function ir(e,t=400){Object(n.n)(()=>{o.k||setTimeout(()=>{Object(K.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var mr=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:m}=e,d=s||c,u=Object(le.a)("input-group",a&&"touched",s&&"error",d&&"with-label",r&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:o||c,ref:l},m),d&&t&&n.a.createElement("label",{htmlFor:t},d))});a(291);var dr=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const m=Object(T.a)();ir(l);const d=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),f=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),O=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,m("PaymentShippingAddress")),n.a.createElement(Ee.a,{ref:l,label:"Address1 (Street)",onChange:d,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(Ee.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(Ee.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(Ee.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(mr,{label:"Country",placeholder:"Country",onChange:p,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},Ut.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(Ee.a,{label:"Post Code",onChange:g,value:e.postCode,inputMode:"text",error:j.postCode})):void 0,c||t||a?n.a.createElement("h5",null,m("PaymentShippingReceiver")):void 0,c&&n.a.createElement(Ee.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(Ee.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(Ee.a,{label:"Phone number",onChange:f,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(aa.a,{label:m("PaymentShippingSave"),subLabel:m("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:O})))});a(292);var ur=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:c})=>{Object(n.n)(()=>{t&&!e.shipping&&c({type:"changeShipping",payload:t[0].id})},[t,e.shipping,c]);const r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(oa.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(293);function hr(e,t,a,c=!1){return n.a.createElement("div",{className:"price-info-item "+(c?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function br(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var pr=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:m,paymentProvider:d,shippingAddress:u,name:h,phone:b,shippingMethod:p}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>hr(e.label,e.amount,r,!1)),a&&a.map(e=>hr(e.label,e.amount,r,!1)),void 0!==s&&hr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},m&&br("icon-card",m,"Payment method"),d&&br("stripe-provider",d,"Payment provider"),u&&br("icon-location",u,"Shipping address"),h&&br("icon-user",h,"Name"),b&&br("icon-phone",b,"Phone number"),p&&br("icon-truck",p,"Shipping method")))});var gr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);c.current&&(c.current.value=t)}},[e]),s=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(Ee.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),vr=(a(294),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),Er=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var fr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);ir(c);const[r,s]=Object(n.r)(ar.Default);Object(n.n)(()=>{const t=cr(e);s(t)},[]);const l=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=cr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case ar.Mastercard:return n.a.createElement("img",{src:vr,alt:""});case ar.Visa:return n.a.createElement("img",{src:Er,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(Ee.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(295);var Or=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),m=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),d=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),p=Object(T.a)(),{formErrors:g={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,p("PaymentCardTitle")),n.a.createElement(fr,{onChange:o,value:e.cardNumber,error:g.cardNumber}),a&&n.a.createElement(Ee.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:g.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(gr,{value:e.expiry,onChange:m,error:g.expiry}),n.a.createElement(Ee.a,{label:"CVV code",onChange:d,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),c||r?n.a.createElement("h5",null,p("PaymentBillingAddress")):void 0,c&&n.a.createElement(mr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:l},Ut.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(Ee.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&n.a.createElement(aa.a,{label:p("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(175);var jr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:m}=e.payment,d=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:p,phoneRequested:g,emailRequested:v,shippingAddressRequested:E,flexible:f,phoneToProvider:O,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:p,shippingAddressRequested:E,phoneRequested:g,emailRequested:v,flexible:f,phoneToProvider:O,emailToProvider:j,currency:C,prices:y,isProviderError:d,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:m,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:m,emailRequested:d,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:p,isProviderError:g,invoiceContent:v,nativeProvider:E,prices:f,needCardholderName:O,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,F]=Nt(lr,sr),L=Xc(b),[A,B]=Object(n.r)(!1),R=Object(T.a)();Object(n.n)(()=>{(a||y||k)&&B(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)F({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(rr.a)(k);F({type:"setFormErrors",payload:{...e}})}},[y,k,F]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;F({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,F]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?yr(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(f,c,M.shipping),[a,M.shipping,f,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=cr(e);return nr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?Cr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const $=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(M);N({requestInfo:t,saveInfo:e})},[N,M]),H=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:c,billingCountry:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),V=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),W=Object(n.m)(e=>{S({step:e})},[S]),Y=Object(n.m)(()=>{switch(B(!0),a){case s.i.ShippingInfo:return $();case s.i.Shipping:return W(s.i.PaymentInfo);case s.i.PaymentInfo:return H();case s.i.Checkout:return V();default:return()=>{}}},[a,$,W,H,V]),K=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return R("PaymentShippingInfo");case s.i.Shipping:return R("PaymentShippingMethod");case s.i.PaymentInfo:return R("PaymentCardInfo");case s.i.Checkout:return R("PaymentCheckout");default:return""}},[a,R]),Z=Object(n.p)(()=>{switch(a){case s.i.Checkout:return`Pay ${L}${(q/100).toFixed(2)}`;default:return"Next Step"}},[a,q,L]);return g?n.a.createElement(ve.a,{className:"error",isOpen:e,onClose:t},"Sorry, Telegram T doesn't support payments with this provider yet. Please use one of our mobile apps to do this.",n.a.createElement(U.a,{isText:!0,onClick:t},"OK")):n.a.createElement(ve.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,K)),void 0!==a?n.a.createElement(x.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case s.i.ShippingInfo:return n.a.createElement(dr,{state:M,dispatch:F,needAddress:Boolean(i),needEmail:Boolean(d||h),needPhone:Boolean(m||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(ur,{state:M,dispatch:F,shippingOptions:c||[],currency:L});case s.i.PaymentInfo:return n.a.createElement(Or,{state:M,dispatch:F,canSaveCredentials:Boolean(!p&&l),needCardholderName:O,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(pr,{prices:f,shippingPrices:M.shipping&&c?yr(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:L});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(D.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(U.a,{type:"submit",onClick:Y,disabled:A,isLoading:A},Z)),y&&!y.field&&function(){if(y)return n.a.createElement(ve.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),y.description||"Error",n.a.createElement(U.a,{isText:!0,onClick:P},"OK"))}())}));function Cr(e,t){return e.find(({id:e})=>e===t)}function yr(e,t){const a=Cr(e,t);return a?a.prices:void 0}var kr=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:m,title:d}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:m,title:d}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:m,credentialsTitle:d,shippingMethod:u})=>{const h=Object(T.a)(),b=Xc(s),p=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,c=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(d,l,u),[l,u,d]);return n.a.createElement(ve.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",h("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(pr,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:m},checkoutInfo:p,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(48);const r={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function s(e){const t=r[e].replace(window.location.origin,"");return c.b("file"+t,n.ApiMediaFormat.Lottie)}},,,,function(e,t,a){"use strict";var n=a(0),c=a(8),r=a(1),s=a(14),l=a(93),o=a(31),i=a(98),m=a(16);a(141);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;var p=Object(n.h)(({file:e,onChange:t,onClose:c})=>{const[p,g]=Object(n.r)(!1);Object(n.n)(()=>{e&&(p?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.o&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(5),a.e(8)]).then(a.bind(null,303)),u=(await h).default),h}().then(()=>g(!0)))},[e,p]);const v=Object(l.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:c,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},p?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(m.a,null),n.a.createElement(o.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!b)return;const e=await b.result(d),a="string"==typeof e?e:Object(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(142);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const m=Object(c.a)(o&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:m,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(p,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,function(e,t,a){},,,,,,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(116),l=a(106);a(126);const o=[0,50],i=[0,20],m=[20,0],d=r.f?c.kb:c.jb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=Object(n.r)(),[u,h]=Object(n.r)(),[b,p]=Object(n.r)(!1),[g,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=Object(n.m)(()=>p(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!b&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(l.a,{id:"closeMonkey",size:t?c.ub:d,className:g?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.ub:d,className:g?"shown":"hidden",animationData:u,playSegment:e?i:m,noLoop:!0}))})},function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(8),l=a(31);const o=r.f?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:i,placeholder:m="Password",submitLabel:d="Next",clearError:u,onChangePasswordVisibility:h,onInputChange:b,onSubmit:p})=>{const g=Object(n.q)(null),[v,E]=Object(n.r)(""),[f,O]=Object(n.r)(!1);return Object(n.n)(()=>{r.k||setTimeout(()=>{g.current.focus()},o)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{g.current.focus(),g.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&p(v)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",v&&"touched",a&&"error")},n.a.createElement("input",{ref:g,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){a&&u();const{target:t}=e;E(t.value),O(t.value.length>=c.U),b&&b(t.value)}}),n.a.createElement("label",null,a||i||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),f&&n.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},d))})},,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){}])]); -//# sourceMappingURL=2.e4ac6d760c71882d981f.js.map \ No newline at end of file diff --git a/dist/2.e4ac6d760c71882d981f.css b/dist/2.f7d16accfb1c79ee906b.css similarity index 100% rename from dist/2.e4ac6d760c71882d981f.css rename to dist/2.f7d16accfb1c79ee906b.css diff --git a/dist/2.f7d16accfb1c79ee906b.js b/dist/2.f7d16accfb1c79ee906b.js new file mode 100644 index 000000000..931c4c46f --- /dev/null +++ b/dist/2.f7d16accfb1c79ee906b.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],Array(91).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return he})),a.d(t,"ForwardPicker",(function(){return ye})),a.d(t,"Errors",(function(){return Ie})),a.d(t,"Notifications",(function(){return we})),a.d(t,"CalendarModal",(function(){return Le})),a.d(t,"DeleteMessageModal",(function(){return Ae})),a.d(t,"PinMessageModal",(function(){return Te})),a.d(t,"UnpinAllMessagesModal",(function(){return De})),a.d(t,"MessageSelectToolbar",(function(){return Re})),a.d(t,"LeftSearch",(function(){return kt})),a.d(t,"Settings",(function(){return sn})),a.d(t,"ContactList",(function(){return on})),a.d(t,"NewChat",(function(){return bn})),a.d(t,"NewChatStep1",(function(){return dn})),a.d(t,"NewChatStep2",(function(){return un})),a.d(t,"ArchivedChats",(function(){return gn})),a.d(t,"ContextMenuContainer",(function(){return wn})),a.d(t,"StickerSetModal",(function(){return Pn})),a.d(t,"HeaderMenuContainer",(function(){return Fn})),a.d(t,"MobileSearch",(function(){return Tn})),a.d(t,"AttachmentModal",(function(){return $n})),a.d(t,"PollModal",(function(){return Vn})),a.d(t,"SymbolMenu",(function(){return gc})),a.d(t,"AttachMenu",(function(){return vc})),a.d(t,"MentionMenu",(function(){return zn})),a.d(t,"EmojiTooltip",(function(){return Ec})),a.d(t,"BotKeyboardMenu",(function(){return fc})),a.d(t,"CustomSendMenu",(function(){return Oc})),a.d(t,"DropArea",(function(){return jc.b})),a.d(t,"TextFormatter",(function(){return Cc.a})),a.d(t,"RightSearch",(function(){return kc})),a.d(t,"StickerSearch",(function(){return Sc})),a.d(t,"GifSearch",(function(){return wc})),a.d(t,"Statistics",(function(){return Ac})),a.d(t,"PollResults",(function(){return Dc})),a.d(t,"Management",(function(){return Qc})),a.d(t,"PaymentModal",(function(){return jr})),a.d(t,"ReceiptModal",(function(){return kr}));var n=a(0),c=a(2),r=a(5),s=a(18),l=a(1),o=a(7),i=a(105),m=a(6),d=a(4),u=a(3),h=a(129),b=a(43),p=a(167),g=a(29),v=a(98),E=a(113),f=a(170),O=a(103),j=a(137),C=a(14);var y=a(38),k=a(44),N=a(136),I=a(50);function S(e,t,a,n){const{mediaEl:c}=L(t,n);if(!c)return;const{width:r}=I.a.get();let o,m=!1;if(n){const{photo:e,video:t,webPage:a}=Object(d.v)(n);m=Boolean(t),o=t?Object(d.bb)(t):Object(d.R)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,m),{width:b,height:p}=Object(i.e)(u,h,o.width,o.height),g=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-p)/2;let{top:E,left:f,width:O,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,p,E,f,O,j);E=e.top,f=e.left,O=e.width,j=e.height}const C=f+O/2-(g+b/2),y=E+j/2-(v+p/2),k=O/b,N=j/p,S=P(a||c);F(S,{top:v+"px",left:g+"px",width:b+"px",height:p+"px",transform:`translate3d(${C}px, ${y}px, 0) scale(${k}, ${N})`}),A(S,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(S),requestAnimationFrame(()=>{S.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(S),setTimeout(()=>{requestAnimationFrame(()=>{document.body.removeChild(S),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function w(e,t,a){const{container:n,mediaEl:c}=L(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:m,height:d}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:p}=c.getBoundingClientRect();let g=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=I.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=I.a.get();g=uO?f=O:O>f&&(O=f));const C=P(t||c);F(C,{top:g+"px",left:h+"px",width:b+"px",height:p+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${f}, ${O})`}),requestAnimationFrame(()=>{document.body.classList.add("ghost-animating"),document.body.appendChild(C),requestAnimationFrame(()=>{C.style.transform="",j&&(C.style.opacity="0"),A(C,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.removeChild(C),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function P(e){const t=document.createElement("div");t.classList.add("ghost");const a=new Image;return"string"==typeof e?a.src=e:e instanceof HTMLVideoElement?a.src=e.poster:a.src=e.src,t.appendChild(a),t}function M(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(d.lb)(t)?Object(m.Db)(e,t):Object(m.f)(e,t)};if(!a||!t)return{};const c=Object(m.k)(e,t,a);return{message:c,sender:c&&Object(m.qb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]);if(Object(T.a)(),!a||!r&&!c)return;const i=a.id<0,m=Object(d.U)(a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},i?n.a.createElement(q.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(q.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title"},m&&Object(G.a)(m)),n.a.createElement("div",{className:"date"},c?"Profile photo":Object(R.d)(1e3*r.date))))}),$=a(168),H=a(57),V=a(33),W=a(114);a(241);var Y=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:m})=>{const[u,h]=Object(n.r)(!1),b=t&&c?Object(d.D)(c,"download"):void 0,{mediaData:p,downloadProgress:g}=Object(E.a)(b,!u);Object(n.n)(()=>{u&&p&&(Object($.a)(p,r),h(!1))},[r,p,u]),Object(n.n)(()=>{h(!1)},[b]);const v=Object(n.m)(e=>{e.stopPropagation(),h(e=>!e)},[]),f=Object(T.a)(),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return o.f?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(H.a,{trigger:O,positionX:"right"},!s&&n.a.createElement(V.a,{icon:"forward",onClick:i},f("Forward")),t?n.a.createElement(V.a,{icon:u?"close":"download",onClick:v},u?Math.round(100*g)+"% Downloading...":"Download"):n.a.createElement(V.a,{icon:"download",href:e,download:r},f("AccActionDownload"))),u&&n.a.createElement(W.a,{progress:g,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("AccActionDownload"),onClick:v},u?n.a.createElement(W.a,{progress:g,size:"s",onClick:v}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(U.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:m},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:f("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},K=a(9);a(242);var Z=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(K.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":"")},e)))},Q=a(27),_=a(122);const X=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var J=a(138),ee=a(135);const te=["bytes","kB","MB","GB","TB","PB"];var ae=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${te[t]}`};a(243);const ne=e=>{e.stopPropagation()};var ce=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:m,onChangeFullscreen:d,onPlayPause:u,onSeek:h})=>{const[b,p]=Object(n.r)(!0);Object(n.n)(()=>{r&&p(r)},[r]),Object(n.n)(()=>{let e;return r||(o.f?p(!1):e=window.setTimeout(()=>{p(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const g=Object(T.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ne},function(e,t,a,c){const r=e/t*100,s=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(U.a,{ariaLabel:g("AccActionPlay"),size:"tiny",ripple:!o.f,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(R.e)(e)} / ${Object(R.e)(t)}`)}(t,a),e<1&&(v=e,E=c,n.a.createElement("div",{className:"player-file-size"},`${ae(E*v)} / ${ae(E)}`)),i&&n.a.createElement(U.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:d},n.a.createElement("i",{className:""+(m?"icon-smallscreen":"icon-fullscreen")})))};a(244);function re(){return(re=Object.assign||function(e){for(var t=1;t{const d=Object(n.q)(null),[u,h]=Object(n.r)(!o.k||!o.d),[b,p]=Object(n.r)(0),[g,v]=Object(n.r)(!0),[E,f,O]=function(e,t){const[a,c]=Object(n.r)(Boolean(X&&document[X]));return Object(n.o)(()=>{const a=()=>{c(Boolean(X&&document[X]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),X||"iOS"===o.n?[a,()=>{e.current&&(X||"iOS"===o.n)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),c(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),c(!1))}]:[!1]}(d,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(_.a)(),{shouldRender:k,transitionClassNames:N}=Object(Q.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?d.current.pause():e&&!o.k&&Object(ee.a)(d.current)},[i,l,e]),Object(n.n)(()=>{d.current.currentTime===d.current.duration?(p(0),h(!1)):p(d.current.currentTime)},[b]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(d.current.pause(),h(!1)):(d.current.play(),h(!0))},[u]);Object(J.a)(d,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{p(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{p(0),h(!1)},[]),F=Object(n.m)(()=>{E&&O?O():!E&&f&&f()},[O,E,f]),L=Object(n.m)(e=>{e.stopPropagation(),d.current.currentTime=Number(e.target.value)*d.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!g)},[g]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,D=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.f?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",re({ref:d,autoPlay:o.k,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:D,onEnded:M},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(W.a,{size:"xl",progress:j?1:r,square:!0,onClick:m})),!t&&!k&&n.a.createElement(ce,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(f),isFullscreen:E,fileSize:s,duration:d.current?d.current.duration:0,isForceVisible:!u||g,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),le=a(8);a(245);var oe=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(Q.a)(e),c=Object(y.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const m=Object(n.m)(()=>{i.current=!0},[]),d=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(T.a)(),h=Object(le.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(U.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.f,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(U.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.f,onClick:()=>{r.current&&l(Math.min(3,s+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:m,onMouseUp:d}))))});a(246);const ie=[1,0,0,1,0,0],me={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var de=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=me[r]||r,[m,d]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[p,g]=Object(n.r)(ie),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||p[0],t=s||p[4],a=l||p[5],n=[...p];p[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),p[4]!==t&&(n[4]=t),p[5]!==a&&(n[5]=a),Object(u.a)(p,n)||g(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||g(ie)},[c]),Object(n.n)(()=>{E.current&&(E.current.style.transform=`matrix(${p.toString()})`)},[a,p]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!c)return;e.stopPropagation(),e.preventDefault();const t={dx:p[4],dy:p[5],x:e.pageX,y:e.pageY};b(t),d(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{d(!1),v.current&&v.current.classList.remove("move"),o&&o(p[4],p[5])},onMouseMove:e=>{if(m){const t=function(e,t){const a=[...p],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);g(t),E.current&&(E.current.style.transform=`matrix(${p.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(247);function ue(e,t){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:!1}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(D.a,{color:"white"}))}var he=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,origin:r}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(r===s.h.SearchResult){if(!t||!n)return{animationLevel:l};const a=Object(m.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:r,message:a,animationLevel:l}:{animationLevel:l}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(m.f)(e,c)||Object(m.Db)(e,c),animationLevel:l,origin:r}}if(!(t&&a&&n))return{animationLevel:l};let o,i,d;if(o=r&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(r)?Object(m.mb)(e,t,n):Object(m.k)(e,t,n),!o)return{animationLevel:l};if(i=r&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(r)?Object(m.nb)(e,t):Object(m.m)(e,t),r===s.h.Inline||r===s.h.Album)d=Object(m.db)(e,t,a)||Object(m.X)(e,t,a);else if(r===s.h.SharedMedia){const t=Object(m.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};d=a}return{chatId:t,threadId:a,messageId:n,senderId:o.senderId,origin:r,message:o,chatMessages:i,collectionIds:d,animationLevel:l}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:m,avatarOwner:u,message:I,chatMessages:P,collectionIds:M,openMediaViewer:F,closeMediaViewer:L,openForwardMenu:A,focusMessage:D,animationLevel:R})=>{const G=Object(n.q)(null),q=Boolean(u||a),$=I?Object(d.Q)(I):void 0,H=I?Object(d.G)(I):void 0,V=I?Object(d.O)(I):void 0,W=Boolean($),K=Boolean(H||$),Q=Boolean(V),_=V?V.isGif:void 0,X=m===s.h.SharedMedia,J=m===s.h.SearchResult,ee=R>=1?"mv-slide":"none",te=2===R?"slide-fade":"none",ae=2===R,ne=u?`avatar${u.id}.jpg`:I&&Object(d.B)(I),ce=Object(y.a)(c),[re,le]=Object(n.r)(!1),[ie,me]=Object(n.r)(!1),[he,be]=Object(n.r)(1),[pe,ge]=Object(n.r)({x:0,y:0}),ve=Object(n.p)(()=>W&&a?[a]:Object(d.i)(P||{},M||[],X),[W,a,P,M,X]),Ee=a?ve.indexOf(a):-1,fe=0===Ee||-1===Ee,Oe=Ee===ve.length-1||-1===Ee;function je(e){return u?Object(d.f)(u,e?"big":"normal"):I&&Object(d.D)(I,e?"viewerFull":"viewerPreview")}!q||ce&&ce===c&&G.current||(G.current=Ee);const Ce=Object(v.a)(I&&(X||J)&&Object(d.D)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ae&&350),ye=Object(v.a)(je(),void 0,u?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ae&&350),{mediaData:ke,downloadProgress:Ne}=Object(E.a)(je(!0),void 0,I&&Object(d.C)(I,"viewerFull"),void 0,ae&&350),Ie=H||V?(H||V).blobUrl:void 0;let Se=!Q&&(Ie||ke)||ye||Ce;const we=function(e){const t=Object(n.q)();let a=!1;Object(O.a)(()=>{if(a=!0,t.current=void 0,!e)return;const n=new Image;if(n.src=e,!n.width)return;const c=Object(C.f)(n);Object(f.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const c=Object(j.a)(e||void 0,Boolean(t.current));return t.current||!a&&c||e||void 0}(!Se&&I&&Object(d.E)(I));Se||m===s.h.SearchResult||(Se=we);const Pe=K?Object(d.R)(W?Object(d.Q)(I):Object(d.G)(I)):void 0,Me=Q?Object(d.bb)(Object(d.O)(I)):void 0;Object(n.n)(()=>{o.f&&document.body.classList.toggle("is-media-viewer-open",q)},[q]);const Fe=Object(g.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Fe):"function"==typeof e.addListener&&e.addListener(Fe),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Fe):"function"==typeof e.removeListener&&e.removeListener(Fe)}},[Fe]);const Le=Object(y.a)(I),Ae=Object(y.a)(m),Te=Object(y.a)(u),De=Object(y.a)(Se);Object(n.n)(()=>{if(ae&&q&&!Le&&!Te){Object(k.b)(350+l.c);const e=I?Object(N.a)(I):void 0;S(Boolean(e),m,Se,I)}ae&&!q&&(Le||Te)&&(Object(k.b)(350+l.c),w(Ae,De,Le||void 0))},[ae,q,m,Ae,I,Le,Te,Se,De]),Object(n.n)(()=>{let e;return ie?le(!0):e=window.setTimeout(()=>{le(!1)},350),()=>{e&&window.clearTimeout(e)}},[ie]);const Be=()=>{me(!1),be(1),ge({x:0,y:0})},xe=Object(n.m)(()=>{me(!ie),be(ie?1:1.5),ie&&ge({x:0,y:0})},[ie]),Ue=Object(n.m)((e,t=!1)=>{be(e),1===e&&t&&Be()},[]),Re=Object(n.m)(()=>{L(),Be()},[L]),Ge=Object(n.m)(()=>{Re(),D({chatId:e,threadId:t,messageId:a})},[Re,e,t,D,a]),qe=Object(n.m)(()=>{A({fromChatId:e,messageIds:[a]}),Be()},[A,e,a]);Object(n.n)(()=>q?Object(b.a)(()=>{ie?Be():Re()}):void 0,[Re,q,ie]),Object(n.n)(()=>{Q&&!_&&Object(p.b)()},[_,Q]);const ze=Object(n.m)((e,t)=>{let a=ve.indexOf(e);return(-1===t&&a>0||1===t&&a{fe||F({chatId:e,threadId:t,messageId:a?ze(a,-1):void 0,origin:m})},[e,t,ze,fe,a,F,m]),He=Object(n.m)(()=>{Oe||F({chatId:e,threadId:t,messageId:a?ze(a,1):void 0,origin:m})},[e,t,ze,Oe,a,F,m]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":$e();break;case"Right":case"ArrowRight":He()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=_&&!o.d;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{ie||Re()},onSwipe:o.k?(e,t)=>{t===h.a.Right?$e():t===h.a.Left?He():Re()}:void 0})},[Re,_,ie,He,$e,re]);const Ve=Object(n.m)((e,t)=>{ge({x:e,y:t})},[]),We=Object(T.a)();function Ye(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ue(ke||ye,Object(i.g)(i.a,!1)));if(I){const e=Object(N.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},K&&ue(Ie||ke||ye||Ce,I&&Object(i.g)(Pe,c)),Q&&n.a.createElement(se,{key:a,url:Ie||ke,isGif:_,posterData:Se,posterSize:I&&Object(i.g)(Me,c,!0),downloadProgress:Ne,fileSize:V.size,isMediaViewerOpen:q,noPlay:!t,onClose:Re}),e&&n.a.createElement(Z,{text:e,onClick:Ge,isHideable:Q}))}}function Ke(){return n.a.createElement(z,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(B.a,{id:"MediaViewer",className:ie?"zoomed":"",isOpen:q},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head"},o.f&&n.a.createElement(U.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:We("Close"),onClick:Re},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(x.a,{activeKey:G.current,name:te},Ke),n.a.createElement(Y,{mediaData:ke||ye,isVideo:Q,isZoomed:ie,message:I,fileName:ne,onCloseMediaViewer:Re,onForward:qe,onZoomToggle:xe,isAvatar:Boolean(u)})),n.a.createElement(de,{noWrap:!re,canPan:ie,panDeltaX:pe.x,panDeltaY:pe.y,zoomLevel:he,onPan:Ve},n.a.createElement(x.a,{className:"slide-container",activeKey:Ee,name:ee},Ye)),!fe&&n.a.createElement("button",{type:"button",className:"navigation prev "+(Q&&!_&&"inline"),"aria-label":We("AccDescrPrevious"),onClick:$e}),!Oe&&n.a.createElement("button",{type:"button",className:"navigation next "+(Q&&!_&&"inline"),"aria-label":We("Next"),onClick:He}),n.a.createElement(oe,{isShown:ie,onChangeZoom:Ue})))})),be=a(47),pe=a(119),ge=a(16),ve=a(99),Ee=a(40),fe=a(102),Oe=a(95),je=a(97),Ce=a(112);a(248);var ye=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n},currentUserId:c}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,currentUser:c?Object(m.Db)(e,c):void 0}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,listIds:t,orderedPinnedIds:a,currentUser:c,isOpen:r,setForwardChatId:s,exitForwardMode:l,loadMoreChats:i})=>{const[m,u]=Object(n.r)(""),h=Object(n.q)(null);Object(n.n)(()=>{r?o.f||setTimeout(()=>{requestAnimationFrame(()=>{h.current&&h.current.focus()})},500):(h.current&&h.current.blur(),setTimeout(()=>{u("")},300))},[r]);const b=Object(n.p)(()=>{const n=t?Object(d.Ab)(e,t,a):void 0;if(!n)return;const r=c?e[c.id]:void 0;return[...r?[r]:[],...n.pinnedChats.filter(({id:e})=>!r||e!==r.id),...n.otherChats.filter(({id:e})=>!r||e!==r.id)]},[e,t,a,c]),p=Object(n.p)(()=>{if(b)return b.filter(e=>!m||Object(be.a)(Object(d.l)(e,c),m)).map(({id:e})=>e)},[b,m,c]),[g,v]=Object(pe.a)(i,p,Boolean(m)),E=Object(n.m)(e=>{u(e.currentTarget.value)},[]),f=Object(T.a)(),O=n.a.createElement("div",{className:"modal-header"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:f("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Ee.a,{ref:h,value:m,onChange:E,placeholder:f("ForwardTo")}));return n.a.createElement(ve.a,{isOpen:r,onClose:l,className:"ForwardPicker",header:O},g&&g.length?n.a.createElement(fe.a,{className:"picker-list custom-scroll",items:g,onLoadMore:v,isDisabled:Boolean(m)},g.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>s({id:e})},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e})))):g&&!g.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,null))})),ke=a(159);a(249);function Ne(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var Ie=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(T.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(ve.a,{isOpen:!0,onClose:t,className:"error",title:Ne(e)},n.a.createElement("p",null,Object(ke.a)(e)),n.a.createElement(U.a,{isText:!0,onClick:t},a("OK")))))})),Se=a(171);var we=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(Se.a,{message:Object(G.a)(e,["emoji","br","links"]),onDismiss:t})))}));a(250);const Pe=["M","T","W","T","F","S","S"];function Me(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=new Date,b=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[g,v]=Object(n.r)(b),[E,f]=Object(n.r)(Fe(b.getHours())),[O,j]=Object(n.r)(Fe(b.getMinutes())),C=g.getFullYear(),y=g.getMonth(),k=g.getDate();Object(n.n)(()=>{r&&v(b)},[r,b]);const N=c&&C>=h.getFullYear()&&y>=h.getMonth()||p&&C>=p.getFullYear()&&y>=p.getMonth(),I=a&&C<=h.getFullYear()&&y<=h.getMonth(),S=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return f(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(g.getTime());n.setHours(a),v(n);const c=Fe(a);f(c),e.target.value=c},[g]),P=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return j(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(g.getTime());n.setMinutes(a),v(n);const c=Fe(a);j(c),e.target.value=c},[g]);return n.a.createElement(ve.a,{isOpen:r,onClose:m,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:m},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(R.f)(g,o.f)),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){v(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",disabled:N,onClick:N?void 0:function(){v(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Pe.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,e))),S.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void v(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(le.a)("day-button",Me(C,y,e,a?h:void 0,c?h:p)?"disabled":""+(e?"clickable":""),e===k&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:E,onChange:w}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P})),n.a.createElement("div",{className:"footer"},n.a.createElement(U.a,{onClick:function(){d(g)}},s?function(e){const t=Object(R.c)(e,!0);return`Send ${"Today"===t?t:"on "+t} at ${Object(R.h)(e)}`}(g):l),i&&n.a.createElement(U.a,{onClick:u,isText:!0},i)))});var Ae=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(m.y)(e)||{},{canDeleteForAll:c}=n&&Object(m.b)(e,t,n)||{},r=Object(m.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(d.lb)(r.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(d.ib)(r)&&!c,willDeleteForAll:r&&Object(d.nb)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,onClose:i,deleteMessages:m,deleteScheduledMessages:d})=>{const u=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];m({messageIds:e,shouldDeleteForAll:!0}),i()},[m,a.id,i,c]),h=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];t?d({messageIds:e}):m({messageIds:e,shouldDeleteForAll:!1}),i()},[c,a.id,t,i,d,m]),b=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,"This will delete it just for you, not for other participants in the chat."),o&&n.a.createElement("p",null,"This will delete it for everyone in this chat."),r&&n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},"Delete for ",s?"me and ":"Everyone",s&&Object(G.a)(s)),n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},"Delete",r?" just for me":""),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var Te=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.lb)(t),n=Object(m.O)(e,t),c=Object(m.f)(e,t),r=!!c&&Object(d.jb)(c),s=!!c&&Object(d.ib)(c),l=!!c&&Object(d.nb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(d.lb)(c.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,onClose:i,pinMessage:m})=>{const d=Object(n.m)(()=>{m({chatId:a,messageId:t,isUnpin:!1}),i()},[m,a,t,i]),u=Object(n.m)(()=>{m({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,m]),h=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:i,className:"pin",header:n.a.createElement("div",{className:"modal-header"},n.a.createElement("h3",{className:"modal-title"},h("PinMessageAlertTitle")))},c?n.a.createElement("p",null,h("PinMessageAlertChannel")):r||s?n.a.createElement("p",null,h("PinMessageAlert")):n.a.createElement("p",null,h("PinMessageAlertChat")),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:d},o?"Pin for me and "+o:"Pin and notify all memebers"),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var De=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=t?Object(m.gb)(e,t):[];return{pinnedMessagesCount:a?a.length:0}})(({isOpen:e,pinnedMessagesCount:t,onClose:a,onUnpin:c})=>{const r=Object(T.a)();return n.a.createElement(ve.a,{isOpen:e,onClose:a,className:"unpin-all",header:n.a.createElement("div",{className:"modal-header"},n.a.createElement("h3",{className:"modal-title"},r("UnpinAllMessages")))},n.a.createElement("p",null,"Do you want to unpin all ",t," messages in this chat?"),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))})),Be=a(37),xe=a(51);var Ue=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(m.e)(e),c=Object(m.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(d.lb)(c.id)?Object(d.Y)(Object(m.Db)(e,Object(d.T)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(d.ib)(c)&&!n,willDeleteForAll:c&&Object(d.nb)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:m,exitMessageSelectMode:d})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),d(),o()},[i,d,a,o]),h=Object(n.m)(()=>{t?m({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),d(),o()},[t,d,o,m,a,i]),b=Object(T.a)();if(a)return n.a.createElement(ve.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:"Delete Messages?"},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},"Delete for ",r?"me and ":"Everyone",r&&Object(G.a)(r)),n.a.createElement(U.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},"Delete",c?" just for me":""),n.a.createElement(U.a,{className:"confirm-dialog-button",isText:!0,onClick:o},b("Cancel")))}));a(251);var Re=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(m.y)(e)||{},{canDelete:a}=Object(m.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(m.pb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,m,d]=Object(Be.a)();Object(n.n)(()=>t&&!i?Object(xe.a)({onBackspace:m,onDelete:m,onEsc:l}):void 0,[t,i,m,l]);const u=Object(y.a)(r||void 0,!0),h=t?r:u,b=Object(T.a)(),p=b("VoiceOver.Chat.MessagesSelected",h),g=Object(le.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:g},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(U.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:p},p),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(V.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:m,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Ue,{isOpen:i,isSchedule:c,onClose:d}))})),Ge=a(158),qe=a(45),ze=a(161),$e=a(149);var He=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),n=a&&Object(d.T)(a);return{chat:a,privateChatUser:n?Object(m.Db)(e,n):void 0,isPinned:Object(m.M)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withHandle:r,onClick:s})=>{const[l,o,i]=Object(Be.a)(),m=Object(ze.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o});if(t)return n.a.createElement(Oe.a,{className:"chat-item-clickable search-result",onClick:()=>s(e),contextActions:m},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e,withHandle:r,avatarSize:"large"}):n.a.createElement(Ce.a,{chatId:e,withHandle:r,avatarSize:"large"}),n.a.createElement($e.a,{isOpen:l,onClose:i,chat:t}))})),Ve=a(130);a(252);const We=Object(K.g)(e=>e(),6e4,!0);var Ye=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const m=Object(n.q)(null);Object(n.n)(()=>{We(()=>{r(),s()})},[r,s]),Object(Ve.a)(m,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(T.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section"},n.a.createElement("div",{ref:m,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>u(e)},n.a.createElement(q.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(G.a)(Object(d.Y)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header"},h("Recent"),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(He,{chatId:e,onClick:u}))))})),Ke=a(132),Ze=a(111);a(253);var Qe=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t);if(!a)return{};const n=Object(d.T)(a);return{chat:a,...n&&{privateChatUser:Object(m.Db)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(d.E)(e),m=Object(v.a)(Object(d.D)(e,"micro")),u=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]);if(Object(T.a)(),c)return n.a.createElement(Oe.a,{className:"ChatMessage chat-item-clickable",ripple:!o.f,onClick:u},n.a.createElement(q.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",null,Object(G.a)(Object(d.l)(c,r))),c.isVerified&&n.a.createElement(Ke.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Ze.a,{className:"date"},Object(R.g)(1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message"},function(e,t,a){if(!t)return Object(G.a)(Object(d.M)(e));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:t,alt:""}),Object(d.O)(e)&&n.a.createElement("i",{className:"icon-play"}),Object(G.a)(Object(d.M)(e,!0),["emoji","highlight"],{highlight:a}))}(e,m||i,t)))))}));a(254);var _e=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(R.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),c=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${c-a}-${e}`);t.push({date:n,text:Object(R.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),Xe=a(109),Je=a(128),et=a(11);const tt=(e,t)=>Number(t.isVerified)-Number(e.isVerified),at=Object(K.g)(e=>e(),500,!0);var nt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:c,messages:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:m}=e.globalSearch,{chats:d,users:u}=o||{},{chats:h,users:b}=i||{},{byChatId:p}=r,{foundIds:g}=m&&m.text||{};return{currentUserId:c,localContactIds:n,localChats:h,localUsers:b,globalChats:d,globalUsers:u,foundIds:g,globalMessagesByChatId:p,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChats:l,localUsers:i,globalChats:m,globalUsers:h,foundIds:b,globalMessagesByChatId:p,chatsById:g,usersById:v,fetchingStatus:E,lastSyncTime:f,onReset:O,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const[I,S]=Object(n.r)(!1),[w,P]=Object(n.r)(!1),M=Object(n.m)(({direction:t})=>{f&&t===s.e.Backwards&&at(()=>{k({type:"text",query:e})})},[f,k,e]),F=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.f||O()},[c,C,y,O]),L=Object(n.m)(e=>{N({id:e})},[N]),A=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return qe.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(d.Z)(a);return n&&Object(be.a)(n,e)||Object(be.a)(a.username,e)}).map(e=>v[e]):[];return Object(u.o)([...Object(be.a)(Object(et.b)("SavedMessages"),e)?[c]:[],...[...t,...l||[],...i||[]].sort(tt).map(e=>e.id)])},[e,r,l,i,v,c]),D=Object(n.p)(()=>!e||e.length<4||!m||!h?qe.a:Object(u.o)([...m,...h].sort(tt).map(e=>e.id)),[m,h,e]),B=Object(n.p)(()=>(e||t)&&b&&0!==b.length?b.map(e=>{const[t,a]=e.split("_").map(Number);return p&&p[t]&&p[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):qe.a,[b,p,e,t]),x=Object(n.m)(()=>{S(!I)},[I]),U=Object(n.m)(()=>{P(!w)},[w]),R=Object(T.a)();const G=E&&!E.chats&&!E.messages&&!A.length&&!D.length&&!B.length;return e||t?n.a.createElement(fe.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:M,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(_e,{searchDate:a,onSelect:j})),G&&n.a.createElement(Xe.a,null),!!A.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},A.map(e=>n.a.createElement(Je.a,{chatOrUserId:e,onClick:L,clickArg:e}))),!!A.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},A.length>3&&n.a.createElement(Ze.a,{onClick:x},I?"Show less":"Show more"),"Contacts and Chats"),A.map((e,t)=>{if(I||!(t>=3))return n.a.createElement(He,{chatId:e,onClick:F})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},D.length>3&&n.a.createElement(Ze.a,{onClick:U},w?"Show less":"Show more"),"Global Search"),D.map((e,t)=>{if(w||!(t>=3))return n.a.createElement(He,{chatId:e,withHandle:!0,onClick:F})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},R("SearchMessages")),B.map((function(t){const a=Object(d.M)(t),c=g[t.chatId];if(a&&c)return n.a.createElement(Qe,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Ye,{onReset:O})}));const ct=Object(K.g)(e=>e(),500,!0);var rt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:m,onSearchDateSelect:u})=>{const h=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&ct(()=>{m({type:"text",query:e,chatId:t})})},[t,i,m,e]),b=Object(n.p)(()=>c&&0!==c.length?c.map(e=>{const[t,a]=e.split("_").map(Number);return r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):qe.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!b.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content custom-scroll chat-list",items:b,onLoadMore:h,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(_e,{searchDate:a,onSelect:u})),p&&n.a.createElement(Xe.a,null),!!b.length&&b.map((function(t){const a=Object(d.M)(t),c=l[t.chatId];if(a&&c)return n.a.createElement(Qe,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function st(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:m}=s&&s[o]||{};return{isLoading:void 0===m||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:m,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var lt=a(155),ot=a(110);const it=Object(K.g)(e=>e(),500,!0);var mt=Object(n.h)(Object(c.h)(st("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:m})=>{const d=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&&it(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),u=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):qe.a,[c,r]),h=Object(n.m)((e,t)=>{m({chatId:t,messageId:e,origin:s.h.SearchResult})},[m]);const b=Object(ot.a)([e],l.ib)&&!a,p=b&&r&&r.length>0&&!e,g=b&&r&&r.length>0&&e,v=Object(le.a)("search-content custom-scroll",g&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:v,items:u,itemSelector:e?".ListItem":".Media",onLoadMore:d,noFastList:!0},!b&&n.a.createElement(ge.a,null),b&&(!r||0===r.length)&&n.a.createElement(Xe.a,null),p&&n.a.createElement("div",{className:"media-list"},u.map(e=>n.a.createElement(lt.a,{key:e.id,idPrefix:"search-media",message:e,onClick:h}))),g&&u.map(e=>n.a.createElement(Qe,{key:e.id,chatId:e.chatId,message:e}))))}));function dt(e,t,a){const{senderId:n}=e;if(!n)return;const c=Object(d.lb)(n)?a[n]:t[n];let r=Object(d.U)(c);const s=t[e.chatId];return s&&(Object(d.lb)(n)&&c.isSelf?r="You → "+Object(d.l)(s):Object(d.kb)(s)&&(r+=" → "+Object(d.l)(s))),r}var ut=a(174);const ht=Object(K.g)(e=>e(),500,!0);var bt=Object(n.h)(Object(c.h)(st("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:m,searchMessagesGlobal:d,focusMessage:u})=>{const h=Object(n.m)(({direction:a})=>{m&&a===s.e.Backwards&&ht(()=>{d({type:"links",query:e,chatId:t})})},[m,d,e,t]),b=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):qe.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const g=Object(ot.a)([e],l.ib)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:b,onLoadMore:h,noFastList:!0},!g&&n.a.createElement(ge.a,null),g&&(!i||0===i.length)&&n.a.createElement(Xe.a,null),g&&i&&i.length>0&&b.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(b[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(ut.a,{key:e.id,message:e,senderTitle:dt(e,c,r),onMessageClick:p}))})))})),pt=a(152);const gt=Object(K.g)(e=>e(),500,!0);var vt=Object(n.h)(Object(c.h)(st("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(n.m)(({direction:a})=>{m&&a===s.e.Backwards&>(()=>{u({type:"documents",query:e,chatId:t})})},[m,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(d.y)(n)?n:void 0}).filter(Boolean):qe.a,[o,i]),g=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const v=Object(ot.a)([e],l.ib)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(ge.a,null),v&&(!i||0===i.length)&&n.a.createElement(Xe.a,null),v&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(pt.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:dt(e,c,r),className:"scroll-item",onDateClick:g}))})))})),Et=a(157);const ft=Object(K.g)(e=>e(),500,!0);var Ot=Object(n.h)(Object(c.h)(st("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:m,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const p=e?"voice":"audio",g=Object(n.m)(({direction:e})=>{d&&e===s.e.Backwards&&ft(()=>{u({type:p,query:t,chatId:a})})},[p,d,u,t,a]),v=Object(n.p)(()=>m&&i?m.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):qe.a,[i,m]),E=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const O=Object(ot.a)([t],l.ib)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(fe.a,{className:"search-content documents-list custom-scroll",items:v,onLoadMore:g,noFastList:!0},!O&&n.a.createElement(ge.a,null),O&&(!m||0===m.length)&&n.a.createElement(Xe.a,null),O&&m&&m.length>0&&v.map((e,t)=>{const a=0===t||Object(R.n)(e.date)!==Object(R.n)(v[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(R.f)(new Date(1e3*e.date))),n.a.createElement(Et.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:dt(e,r,o),date:e.date,lastSyncTime:d,className:"scroll-item",onPlay:f,onDateClick:E}))})))}));a(255);const jt=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],Ct=[{type:s.c.ChatList,title:"All Messages"},...jt.slice(1)],yt=Object.keys(s.c).length/2;var kt=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,currentContent:a=s.c.ChatList,chatId:c,setGlobalSearchContent:r,setGlobalSearchDate:l,onReset:o})=>{const[i,m]=Object(n.r)(0),d=Object(n.p)(()=>Object(R.l)(e),[e]),u=Object(n.m)(e=>{const t=jt[e];r({content:t.type}),m(e)},[r]),h=Object(n.m)(e=>{l({date:e.getTime()/1e3})},[l]);return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Ge.a,{activeTab:i,tabs:c?Ct:jt,onSwitchTab:u}),n.a.createElement(x.a,{name:"slide",renderCount:yt,activeKey:a},()=>{switch(a){case s.c.ChatList:return c?n.a.createElement(rt,{searchQuery:e,dateSearchQuery:d,onReset:o,onSearchDateSelect:h}):n.a.createElement(nt,{searchQuery:e,searchDate:t,dateSearchQuery:d,onReset:o,onSearchDateSelect:h});case s.c.Media:return n.a.createElement(mt,{searchQuery:e});case s.c.Links:return n.a.createElement(bt,{searchQuery:e});case s.c.Files:return n.a.createElement(vt,{searchQuery:e});case s.c.Music:return n.a.createElement(Ot,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(Ot,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function Nt(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const It=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],St=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],wt=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Pt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Mt(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,wt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,Pt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Ft(e){if(e){const{includedChatIds:t,...a}=e;if(Object.values(a).filter(Boolean).length>1||t&&t.length)return"";if(a.bots)return"Bots";if(a.groups)return"Groups";if(a.channels)return"Channels";if(a.contacts)return"Contacts";if(a.nonContacts)return"Non-Contacts"}return""}const Lt={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},At=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,wt)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,Pt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,wt),title:e.folder.title?e.folder.title:Ft(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,Pt),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:a,...n}=t.payload;return{mode:"edit",folderId:e,folder:n,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return Lt;default:return e}};const Tt={currentPassword:"",password:"",hint:"",email:""},Dt=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return Tt;default:return e}};var Bt=a(108);var xt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{const[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),h=Object(n.m)(()=>{m(!0)},[]),b=Object(n.m)(()=>{m(!1)},[]),p=Object(n.m)(()=>{u(!0)},[]),g=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{b(),r()},[b,r]),E=Object(n.m)(()=>{g(),l({id:t}),a()},[t,g,l,a]),f=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(U.a,{round:!0,ripple:!o.f,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),O=Object(T.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:O("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case s.m.EditProfile:return n.a.createElement("h3",null,O("EditProfile"));case s.m.General:return n.a.createElement("h3",null,O("General"));case s.m.Notifications:return n.a.createElement("h3",null,O("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,O("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,O("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,O("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,O("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,O("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,O("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,O("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,O("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,O("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,O("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,O("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,O("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,O("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,O("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,O("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,O("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,O("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,O("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,O("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,O("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,O("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,O("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,O("FilterEdit")),t&&n.a.createElement(H.a,{className:"settings-more-menu",trigger:f,positionX:"right"},n.a.createElement(V.a,{icon:"delete",destructive:!0,onClick:p},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.FoldersIncludedChats?n.a.createElement("h3",null,O("FilterInclude")):n.a.createElement("h3",null,O("FilterExclude")),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:c,ariaLabel:O("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,O("SETTINGS")),n.a.createElement(H.a,{className:"settings-more-menu",trigger:f,positionX:"right"},n.a.createElement(V.a,{icon:"logout",onClick:h},O("LogOutTitle"))))}}(),n.a.createElement(Bt.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(Bt.a,{isOpen:d,onClose:g,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),Ut=a(19);var Rt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(m.Db)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(q.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(d.Z)(t)),n.a.createElement("p",{className:"phone"},Object(Ut.c)(t.phoneNumber))),n.a.createElement(Oe.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("EditProfile")),n.a.createElement(Oe.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(Oe.a,{icon:"settings",onClick:()=>e(s.m.General)},a("GeneralSettings")),n.a.createElement(Oe.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(Oe.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(Oe.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),Gt=a(121);a(256);var qt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(le.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(U.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const zt=/https:\/\/t\.me\/?/i,$t=/^([a-zA-Z0-9_]+)$/,Ht=Object(K.a)(e=>e(),250,!1);var Vt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(T.a)(),m=t?"SetUrl":"Username",d=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,d+" is too short"]:l.length>32?[void 0,d+" is too long"]:$t.test(l)?void 0===c?[]:[c?i(m+"Available","Username"):void 0,!1===c?i(m+"InUse"):void 0]:[void 0,d+" contains invalid characters"]:[],[l,c,i,m,d]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(zt,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&$t.test(e)}(a);n&&Ht(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(Ee.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:d,error:h,success:u,readOnly:a})});const Wt=Object(K.g)(e=>e(),6e4,!0);var Yt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(m.Db)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(d.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:m,updateProfile:d,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[p,g]=Object(n.r)(!1),[E,f]=Object(n.r)(),[O,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),F=o===s.j.InProgress,L=!1===w,A=Object(n.p)(()=>!L&&(Boolean(O)||p||!0===i),[O,p,L,i]);Object(n.n)(()=>{Wt(()=>{m()})},[m]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(g(!1),b(!1),f(void 0))},[o]);const B=Object(n.m)(e=>{j(e)},[]),x=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),R=Object(n.m)(e=>{S(e.target.value),g(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?f("Bio can' be longer than 70 characters"):d({photo:O,...p&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):f("Please provide your first name")},[O,C,k,I,p,w,h,d]),$=Object(T.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:M,onChange:B,title:"Edit your profile photo",disabled:F}),n.a.createElement(Ee.a,{value:C,onChange:x,label:$("FirstName"),disabled:F,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(Ee.a,{value:k,onChange:U,label:$("LastName"),disabled:F}),n.a.createElement(Ee.a,{value:I,onChange:R,label:$("UserBio"),disabled:F,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description"},Object(G.a)($("BioAbout"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},$("Username")),n.a.createElement(Vt,{currentUsername:w||"",isLoading:F,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description"},Object(G.a)($("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description"},"This link opens a chat with you:",n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(qt,{isShown:A,onClick:z,disabled:F,ariaLabel:"Save changes"},F?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Kt=a(117),Zt=a(107);const Qt=Object(K.g)(e=>e(),6e4,!0);var _t=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,loadRecommendedChatFolders:i,addChatFolder:m,showError:u})=>{const[h,b]=Object(n.r)(),[p,g]=Object(n.r)(!1),v=Object(n.m)(()=>g(!0),[]);Object(n.n)(()=>{h||Object(Kt.a)("FoldersAll").then(b)},[h]),Object(n.n)(()=>{Qt(()=>{i()})},[i]);const E=Object(n.m)(()=>{Object.keys(s).length>=10?u({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,u,e]),f=Object(T.a)(),O=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(d.o)(a,c,n,e,f)}})},[r,a,s,c,f]),j=Object(n.m)(e=>{Object.keys(s).length>=10?u({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):m({folder:e})},[s,m,u]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},h&&n.a.createElement(Zt.a,{id:"settingsFoldersMain",size:l.mb,animationData:h,play:p,noLoop:!0,onLoad:v})),n.a.createElement("p",{className:"settings-item-description mb-3"},f("CreateNewFilterInfo")),n.a.createElement(U.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:E},n.a.createElement("i",{className:"icon-add"}),f("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},f("Filters")),O&&O.length?O.map(e=>n.a.createElement(Oe.a,{className:"mb-2",narrow:!0,onClick:()=>t(s[e.id])},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle)))):O&&!O.length?n.a.createElement("p",{className:"settings-item-description my-4"},"You have no folders yet."):n.a.createElement(ge.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},f("FilterRecommended")),o.map(e=>n.a.createElement(Oe.a,{className:"mb-2",narrow:!0,onClick:()=>j(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(U.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0},f("Add")))))))}));a(257);var Xt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>n.a.createElement(U.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t);const Jt="Please provide a title for this folder.",ea="Please select at least one chat for this folder.";var ta=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:m,loadMoreChats:h})=>{const[b,p]=Object(n.r)(),[g,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[f,O]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=Mt(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=Mt(e,"excluded");Object(n.n)(()=>{b||Object(Kt.a)("FoldersNew").then(p)},[b]),Object(n.n)(()=>{O(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[f?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,f,s,o]);Object(n.n)(()=>{(S.lengthO(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?It.find(({key:t})=>t===e):St.find(({key:t})=>t===e);if(a)return n.a.createElement(Oe.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},P(a.title))}(t,e)),a.map(e=>n.a.createElement(Oe.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(d.lb)(e)?n.a.createElement(je.a,{avatarSize:"small",userId:e}):n.a.createElement(Ce.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Xt,{count:r,itemName:"chat",onClick:s}))}return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},b&&n.a.createElement(Zt.a,{id:"settingsFoldersEdit",size:l.mb,animationData:b,play:g&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3"},P("FilterIncludeInfo")),n.a.createElement(Ee.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Jt?Jt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===ea&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2"},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterInclude")),n.a.createElement(Oe.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterExclude")),n.a.createElement(Oe.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(qt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):m({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:ea}):t({type:"setError",payload:Jt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),aa=a(41);a(175),a(258);var na=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const m=Object(n.q)(null),u="included"===e?It:St,h=a.length+c.length>10,b=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{m.current.focus()})},500)},[]);const p=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),s(t)},[a,s]),g=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(T.a)();const[f,O]=Object(pe.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(Je.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(Je.a,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type"},E(e.title)),n.a.createElement(aa.a,{label:"",checked:c.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header"},E("FilterChats"))),f&&f.length?f.map((function(e){const t=a.includes(e);return n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>p(e),ripple:!0,disabled:!t&&b},Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e,withChatType:!0}),n.a.createElement(aa.a,{label:"",checked:t,round:!0}))})):f&&!f.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,{key:"loading"})))});var ca=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:m}=t,{selectedChatIds:u,selectedChatTypes:h}=Mt(t,e,!0),b=Object(n.p)(()=>{const e=r?Object(d.Ab)(c,r,s,"all"):void 0,t=l?Object(d.Ab)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(b)return b.filter(e=>!m||Object(be.a)(Object(d.l)(e),m)||u.includes(e.id)).map(({id:e})=>e)},[b,m,u]),g=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),v=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),E=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(na,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:m,onSelectedIdsChange:v,onSelectedChatTypesChange:E,onFilterChange:g,onLoadMore:i}):n.a.createElement(ge.a,null)}));a(259);var ra=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),m=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),d=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(_t,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(ta,{state:t,dispatch:a,onAddIncludedChats:m,onAddExcludedChats:d,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(ca,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(ca,{mode:"excluded",state:t,dispatch:a});default:return}}),sa=a(96);a(260);var la=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),o=Object(le.a)("RangeSlider",r&&"disabled"),i=Object(n.p)(()=>{if(e)return c/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(c-t.min)/e*100}return 0},[c,e,t]),[m,d,u]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:o},a&&n.a.createElement("div",{className:"slider-top-row"},n.a.createElement("span",{className:"label"},a),t&&n.a.createElement("span",{className:"value"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${i}%`}),n.a.createElement("input",{min:m,max:d,value:c,step:u,type:"range",onChange:l}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(le.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),oa=a(118),ia=a(104),ma=a(46);var da=Object(n.h)(({size:e=l.sb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(sa.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:m,transitionClassNames:d}=Object(ia.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!m&&Object(ma.c)(t.title,2),m&&i&&n.a.createElement(Zt.a,{id:o,size:e,animationData:i,className:d}))});var ua=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(sa.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(ia.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(ma.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(261);var ha=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:m})=>{const d=Object(n.q)(null),{isAnimated:u}=e,h="sticker"+e.id,b="sticker-button-"+e.id,p=Object(sa.b)(d,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,E=Object(v.a)(h+"?size=m",!p,r.ApiMediaFormat.BlobUrl),f=p&&!c,O=Object(v.a)(h,!f,r.ApiMediaFormat.Lottie),[j,C,y]=Object(Be.a)(Boolean(O)),k=j&&f,{shouldRenderThumb:N,shouldRenderFullMedia:I,transitionClassNames:S}=Object(ia.a)(E||k,"slow");Object(n.n)(()=>{f||y()},[y,f]);const w=Object(le.a)("StickerButton",u&&"animated",b,l),P=N&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:d,className:w,title:s||e&&e.emoji,style:P,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},I&&!k&&n.a.createElement("img",{src:E,className:S}),f&&O&&n.a.createElement(Zt.a,{id:h,animationData:O,play:!0,size:t,isLowPriority:!0,onLoad:C}),m&&n.a.createElement(U.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),m(e)}},n.a.createElement("i",{className:"icon-close"})))});a(262);var ba=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(T.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(Oe.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(U.a,{ariaLabel:e.title,color:"translucent"},e.isAnimated?n.a.createElement(da,{size:l.nb,stickerSet:e,observeIntersection:t}):n.a.createElement(ua,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Oe.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(r)},n.a.createElement(ha,{sticker:r,size:l.nb,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i"))))}),pa=a(153);const ga=o.k?void 0:[{value:"enter",label:"Send by Enter",subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:`Send by ${o.e?"Cmd":"Ctrl"} + Enter`,subLabel:"New line by Enter"}],va=["Solid and Steady","Nice and Fast","Lots of Stuff"];var Ea=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:o,shouldAutoDownloadMediaInPrivateChats:i,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:d,shouldAutoPlayGifs:u,shouldAutoPlayVideos:h,shouldSuggestStickers:b,shouldLoopStickers:p,setSettingOption:g,loadStickerSets:v,loadAddedStickers:E})=>{const f=Object(n.q)(null),{observe:O}=Object(sa.a)({rootRef:f}),[j,C,y]=Object(Be.a)(),[k,N]=Object(n.r)();Object(n.n)(()=>{v()},[v]),Object(n.n)(()=>{t&&t.length&&E()},[t,E]);const I=Object(n.m)(e=>{va.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),g({animationLevel:e})},[g]),S=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),g({messageTextSize:e})},[g]),w=Object(n.m)(e=>{N(e),C()},[C]),P=Object(T.a)(),M=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header"},P("SETTINGS")),n.a.createElement(la,{label:P("TextSize"),range:{min:12,max:20},value:c,onChange:S}),n.a.createElement(Oe.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},P("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},"Animation Level"),n.a.createElement("p",{className:"settings-item-description"},"Choose the desired animations amount."),n.a.createElement(la,{options:va,value:r,onChange:I})),ga&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("Keyboard")),n.a.createElement(oa.a,{name:"keyboard-send-settings",options:ga,onChange:e=>g({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AutoDownloadMedia")),n.a.createElement(aa.a,{label:P("Contacts"),checked:o,onCheck:e=>g({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(aa.a,{label:P("AutodownloadPrivateChats"),checked:i,onCheck:e=>g({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(aa.a,{label:P("AutodownloadGroupChats"),checked:m,onCheck:e=>g({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(aa.a,{label:P("FilterChannels"),checked:d,onCheck:e=>g({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AutoplayMedia")),n.a.createElement(aa.a,{label:P("GifsTab2"),checked:u,onCheck:e=>g({shouldAutoPlayGifs:e})}),n.a.createElement(aa.a,{label:P("VideosTitle"),checked:h,onCheck:e=>g({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},P("AccDescrStickers")),n.a.createElement(aa.a,{label:P("SuggestStickers"),checked:b,onCheck:e=>g({shouldSuggestStickers:e})}),n.a.createElement(aa.a,{label:P("LoopAnimatedStickers"),checked:p,onCheck:e=>g({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},M&&M.map(e=>n.a.createElement(ba,{key:e.id,stickerSet:e,observeIntersection:O,onClick:w}))),k&&n.a.createElement(pa.a,{isOpen:j,fromSticker:k,onClose:y})))}));let fa;function Oa(e="*",t,a=!1){fa||(fa=document.createElement("input"),fa.setAttribute("type","file")),fa.setAttribute("accept",e),a?fa.removeAttribute("multiple"):fa.setAttribute("multiple","multiple"),fa.onchange=null,fa.value="",fa.onchange=t,fa.click()}function ja(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Ca(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function ya([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var Ia=a(13);a(263);var Sa=Object(n.h)(({wallpaper:e,isSelected:t,onClick:a})=>{const{slug:c,document:r}=e,o="wallpaper"+r.id,i=r.previewBlobUrl,m=Object(v.a)(o+"?size=m"),d=Object(j.a)(r.thumbnail&&r.thumbnail.dataUri,Boolean(m),300),{shouldRenderThumb:u,shouldRenderFullMedia:h,transitionClassNames:b}=Object(ia.a)(m||i,"slow"),[p,g]=Object(n.r)(!1),{mediaData:f,downloadProgress:O}=Object(E.a)(o,!p),k=!1===Object(y.a)(p),{shouldRender:N,transitionClassNames:I}=Object(Q.a)(p&&!f||c===s.n,void 0,k,"slow"),S=Object(n.m)(()=>{(async()=>{const e=await Object(C.e)(f);await Ia.d(l.l,l.l,e),a(c)})()},[f,a,c]);Object(n.n)(()=>{f&&S()},[f,S]);const w=Object(n.m)(()=>{f?S():g(e=>!e)},[f,S]),P=Object(le.a)("WallpaperTile",t&&"selected");return n.a.createElement("div",{className:P,onClick:w},n.a.createElement("div",{className:"media-inner"},u&&n.a.createElement("img",{src:d,className:"thumbnail",alt:""}),h&&n.a.createElement("img",{src:m||i,className:"full-media "+b,alt:""}),N&&n.a.createElement("div",{className:Object(le.a)("spinner-container",I)},n.a.createElement(W.a,{progress:O,onClick:w}))))});a(264);const wa=Object(K.g)(e=>e(),6e4,!0);var Pa=Object(n.h)(Object(c.h)(e=>{const{isBackgroundBlurred:t,customBackground:a}=e.settings.byKey,{loadedWallpapers:n}=e.settings;return{customBackground:a,isBackgroundBlurred:t,loadedWallpapers:n}},(e,t)=>Object(u.l)(t,["setSettingOption","loadWallpapers","uploadWallpaper"]))(({onScreenSelect:e,customBackground:t,isBackgroundBlurred:a,loadedWallpapers:c,setSettingOption:r,loadWallpapers:o,uploadWallpaper:i})=>{Object(n.n)(()=>{wa(()=>{o()})},[o]);const m=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),d=Object(n.m)(()=>{Oa("image/jpeg",m,!0)},[m]),u=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),h=Object(n.m)(()=>{r({customBackground:void 0,patternColor:l.s})},[r]),b=Object(n.m)(e=>{r({customBackground:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),m=i.getContext&&i.getContext("2d");if(!m)return t;const d=await Object(C.g)(e);c=d.naturalHeight||d.offsetHeight||d.height,n=d.naturalWidth||d.offsetWidth||d.width,i.height=c,i.width=n,m.drawImage(d,0,0);try{a=m.getImageData(0,0,n,c)}catch(e){return t}for(r=a.data.length;(s+=20){r({patternColor:Na(e)})})},[c,r]),p=Object(n.m)(e=>{r({isBackgroundBlurred:e.target.checked})},[r]),g=Object(T.a)(),v=c&&c[0]&&c[0].slug===s.n;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Oe.a,{icon:"camera-add",className:"mb-0",disabled:v,onClick:d},g("UploadImage")),n.a.createElement(Oe.a,{icon:"colorize",className:"mb-0",onClick:u},g("SetColor")),n.a.createElement(Oe.a,{icon:"favorite",onClick:h},g("ThemeResetToDefaults")),n.a.createElement(aa.a,{label:g("BackgroundBlurred"),checked:Boolean(a),onChange:p})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(Sa,{wallpaper:e,isSelected:t===e.slug,onClick:b}))):n.a.createElement(ge.a,null))}));a(265);const Ma=ya(ja("e6ebee")),Fa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function La(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Aa({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Ta=Object(n.h)(Object(c.h)(e=>({customBackground:e.settings.byKey.customBackground}),(e,t)=>Object(u.l)(t,["setSettingOption"]))(({customBackground:e,setSettingOption:t})=>{const a=Object(n.q)(null),c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(!0),[l,o]=Object(n.r)(function(e){return e&&e.startsWith("#")?ya(ja(e.replace("#",""))):Ma}(e)),i=Object(n.q)(l);Object(n.n)(()=>{i.current=l},[l]);const[m,d,b]=Object(Be.a)(),[p,g]=Object(n.r)(""),[v,E]=Object(n.r)(""),f=Object(n.q)(),O=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:c.current.offsetLeft,...Object(u.l)(c.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:r.current.offsetLeft,...Object(u.l)(r.current.getBoundingClientRect(),["width"])};function n(t){const n=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+a.current.scrollTop),e.height-1)],{huePosition:c}=La(i.current,f.current);o(Aa({colorPosition:n,huePosition:c},f.current)),d()}function s(e){const{colorPosition:a}=La(i.current,f.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);o(Aa({colorPosition:a,huePosition:n},f.current)),d()}f.current={colorRect:e,hueRect:t},Object(h.b)(c.current,{onCapture:n,onDrag:n,onRelease:b,onClick:b,withCursor:!0}),Object(h.b)(r.current,{onCapture:s,onDrag:s,onRelease:b,onClick:b,withCursor:!0})},[d,b]);const{colorPosition:j=[0,0],huePosition:C=0}=f.current?La(l,f.current):{},y=Ca(ka(l)),k=l[0],N=Ca(ka([k,1,1]));Object(n.n)(()=>{const e=ka(l),a="#"+Ca(e);g(e.join(", ")),E(a),s.current||t({customBackground:a,patternColor:Na(e)}),s.current=!1},[l,t]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ka([t,1,1]);let m=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),c=n.data;let r=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));o(ya(e))}e.currentTarget.value=t},[]),S=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&o(ya(ja(t.replace("#","")))),e.currentTarget.value=t},[]),w=Object(n.m)(e=>{o(ya(ja(e.currentTarget.dataset.color.replace("#",""))))},[]),P=Object(le.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",m&&"is-dragging");return n.a.createElement("div",{ref:a,className:P},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:c,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${j[0]}px, ${j[1]}px); background-color: #${y};`})),n.a.createElement("div",{ref:r,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${C}px); background-color: #${N};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(Ee.a,{value:v,label:"HEX",onChange:S}),n.a.createElement(Ee.a,{value:p,label:"RGB",onChange:I}))),n.a.createElement("div",{className:"predefined-colors"},Fa.map(e=>n.a.createElement("div",{className:e==="#"+y?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:w}))))}));var Da=Object(n.h)(Object(c.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(u.l)(t,["loadNotificationsSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationsSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:m})=>{Object(n.n)(()=>{o()},[o]);const d=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),d="contact"===l?t:"group"===l?c:s;m({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,isShowPreviews:d},..."showPreviews"===o&&{isShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,m]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(T.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("AutodownloadPrivateChats")),n.a.createElement(aa.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{d(e,"contact","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{d(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterGroups")),n.a.createElement(aa.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{d(e,"group","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{d(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterChannels")),n.a.createElement(aa.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{d(e,"broadcast","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{d(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("PhoneOther")),n.a.createElement(aa.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Ba=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:m,loadPrivacySettings:d,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),d()},[u,h,d]);const b=Object(T.a)();function p(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Oe.a,{icon:"delete-user",narrow:!0,onClick:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle"},b("Users",a)))),n.a.createElement(Oe.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(Oe.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},b("PrivacyTitle")),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle"},p(r)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle"},p(l)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle"},p(o)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle"},p(i)))),n.a.createElement(Oe.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle"},p(m))))))}));var xa=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(Be.a)();Object(n.n)(()=>{a()},[a]);const m=Object(n.m)(e=>{s(e),o(),Object(et.c)(e,()=>{i(),c({language:e})})},[o,i,c]),d=Object(n.p)(()=>e?function(e){return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a}))}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},d?n.a.createElement(oa.a,{name:"keyboard-send-settings",options:d,selected:r,loadingOption:l?r:void 0,onChange:m}):n.a.createElement(ge.a,null))}));function Ua(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var Ra=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:m})=>{const d=Object(T.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:d("P2PEverybody")},{value:"contacts",label:d("P2PContacts")}];default:return[{value:"everybody",label:d("P2PEverybody")},{value:"contacts",label:d("P2PContacts")},{value:"nobody",label:d("P2PNobody")}]}},[d,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=Ua(e),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return d("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return d("LastSeenTitle");case s.m.PrivacyProfilePhoto:return d("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return d("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return d("WhoCanAddMe");default:return}},[d,e]),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return d("CustomHelp");default:return}},[d,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),f=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),O=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{m({privacyKey:b,visibility:e})},[b,m]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},p),n.a.createElement(oa.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),g&&n.a.createElement("p",{className:"settings-item-description-larger"},g)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},d("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(Oe.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date"},"+",f),n.a.createElement("span",{className:"title"},d("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},d("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(Oe.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date"},"−",O),n.a.createElement("span",{className:"title"},d("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},d("EditAdminAddUsers"))))))}));function Ga(e){return[e.region,e.country].filter(Boolean).join(", ")}function qa(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var za=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(Be.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),m=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),d=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(T.a)();function h(e){return n.a.createElement(Oe.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size"},n.a.createElement("span",{className:"date"},Object(R.g)(1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},qa(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",Ga(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},m&&(p=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},u("AuthSessions.CurrentSession")),n.a.createElement(Oe.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},p.appName),n.a.createElement("span",{className:"subtitle black tight"},qa(p)),n.a.createElement("span",{className:"subtitle"},p.ip," - ",Ga(p)))),n.a.createElement(Oe.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),d&&(b=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},"Other Sessions"),b.map(h))),d&&n.a.createElement(Bt.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,p}));var $a=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(T.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2"},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,s){const o=Object(d.lb)(a),i=o?t[a]:void 0,m=o?void 0:e[a],u=Object(le.a)("Chat chat-item-clickable blocked-list-item",o?"private":"group");return n.a.createElement(Oe.a,{key:a,className:u,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(s+c)*l.h}px;`},n.a.createElement(q.a,{size:"medium",user:i,chat:m}),n.a.createElement("div",{className:"contact-info"},n.a.createElement("h3",null,Object(G.a)((o?Object(d.Z)(i):Object(d.l)(m))||"")),i&&i.phoneNumber&&n.a.createElement("div",{className:"contact-phone"},Object(Ut.c)(i.phoneNumber)),i&&!i.phoneNumber&&i.username&&n.a.createElement("div",{className:"contact-username"},"@",i.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results"},"List is empty"):n.a.createElement(ge.a,{key:"loading"}))),n.a.createElement(qt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),Ha=a(120);var Va=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},Object(G.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Oe.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(Oe.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(Oe.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),Wa=a(139),Ya=a(140);var Ka=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,m]=Object(n.r)(""),[d,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?m("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),m("")},[l]),p=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Wa.a,{isBig:!0,isPasswordVisible:d})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ya.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||p("Next"),clearError:b,isLoading:t,isPasswordVisible:d,onChangePasswordVisibility:u,onSubmit:h})))});var Za=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(U.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Qa=o.f?550:400;var _a=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(m.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const m=Object(n.q)(null),[d,u]=Object(n.r)(""),[h,b,p]=Object(Be.a)(!1);Object(n.n)(()=>{o.k||setTimeout(()=>{m.current.focus()},Qa)},[]);const g=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),m.current&&i(d)}},n.a.createElement(Ee.a,{ref:m,value:d,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),d?n.a.createElement(U.a,{type:"submit",isLoading:a,ripple:!0},g("Continue")):n.a.createElement(U.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},g("YourEmailSkip"))),s&&n.a.createElement(ve.a,{className:"narrow",isOpen:h,title:g("YourEmailSkipWarning"),onClose:p},Object(G.a)(g("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(U.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{p(),i()}},g("YourEmailSkip")),n.a.createElement(U.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:p},g("Cancel"))))))}));var Xa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(U.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const Ja=o.f?550:400;var en=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,m]=Object(n.r)("");Object(n.n)(()=>{o.k||setTimeout(()=>{l.current.focus()},Ja)},[]);const d=Object(T.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ha.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{value:i,ref:l,inputMode:"decimal",label:d("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),m(a),e.target.value=a}}),a&&n.a.createElement(ge.a,null)))}));var tn=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:m,checkPassword:d,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:p})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const g=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),f=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),O=Object(n.m)(e=>{o({type:"setEmail",payload:e}),m({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,m]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),d({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[d,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),m({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,m]),N=Object(n.m)(e=>{p({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[p,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),d({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[d,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(T.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Za,{onStart:g});case s.m.TwoFaNewPassword:return n.a.createElement(Ka,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Ka,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(_a,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:f});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(_a,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:O});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(en,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(Xa,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Va,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Ka,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Ka,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(_a,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Ka,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(_a,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(en,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var an=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:m})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),p=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[g,v]=Object(pe.a)(m,e,Boolean(a)),E=Object(T.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll"},t.map((e,a)=>n.a.createElement(Je.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(Oe.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(aa.a,{label:"",checked:t.includes(e)}),Object(d.lb)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(Ce.a,{chatId:e})))):l||!g||g.length?n.a.createElement(ge.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function nn(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var cn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:nn(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:m,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,g]=Object(n.r)(""),[v,E]=Object(n.r)(!1),[f,O]=Object(n.r)(b),j=Object(n.p)(()=>{const e=l?Object(d.Ab)(r,l,o,"all"):void 0,t=i?Object(d.Ab)(r,i,m,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,m]),C=Object(n.p)(()=>{if(j)return j.filter(t=>(Object(d.lb)(t.id)&&t.id!==e||Object(d.kb)(t))&&(!p||Object(be.a)(Object(d.l)(t),p)||b.includes(t.id))).map(({id:e})=>e)},[j,e,p,b]),y=Object(n.m)(e=>{O(e),E(!0)},[]),k=Object(n.m)(()=>{u({privacyKey:Ua(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]),N=Object(T.a)();return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(an,{itemIds:C||[],selectedIds:f,filterValue:p,filterPlaceholder:N(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:y,onFilterChange:g}),n.a.createElement(qt,{isShown:v,onClick:k,ariaLabel:N(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(266);const rn=Object.keys(s.m).length/2;var sn=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a})=>{const[c,r]=Nt(At,Lt),[l,i]=Nt(Dt,Tt),m=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{r({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===c.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[c.mode,r,e,a,t]),d=Object(n.m)(()=>{r({type:"saveFilters"}),m()},[r,m]);function u(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(xt,{currentScreen:e,onReset:m,onSaveFilter:d,editedFolderId:c.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(Rt,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Yt,null);case s.m.General:return n.a.createElement(Ea,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Da,null);case s.m.Privacy:return n.a.createElement(Ba,{onScreenSelect:t});case s.m.Language:return n.a.createElement(xa,null);case s.m.GeneralChatBackground:return n.a.createElement(Pa,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(Ta,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement(za,null);case s.m.PrivacyBlockedUsers:return n.a.createElement($a,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(Ra,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(cn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(cn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(ra,{currentScreen:e,state:c,dispatch:r,onScreenSelect:t,onReset:m});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(tn,{currentScreen:e,state:l,dispatch:i,onScreenSelect:t});default:return}}())}return n.a.createElement(x.a,{id:"Settings",name:o.f?"slide-layers":"push-slide",activeKey:e,renderCount:rn},u)});const ln=Object(K.g)(e=>e(),6e4,!0);var on=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{ln(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(d.Z)(n);return c&&Object(be.a)(c,e)}):a;return Object(d.W)(n,t)},[e,t,a]),[i,m]=Object(pe.a)(void 0,l,Boolean(e));return n.a.createElement(fe.a,{items:i,onLoadMore:m,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.f},n.a.createElement(je.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(ge.a,{key:"loading"}))}));const mn=Object(K.g)(e=>e(),6e4,!0);var dn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{currentUserId:n}=e,{query:c,fetchingStatus:r,globalResults:s,localResults:l}=e.globalSearch,{users:o}=s||{},{users:i}=l||{};return{currentUserId:n,usersById:a,localContactIds:t,searchQuery:c,isSearching:r&&r.chats,globalUsers:o,localUsers:i}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,localContactIds:o,searchQuery:i,isSearching:m,localUsers:h,globalUsers:b,loadContactList:p,setGlobalSearchQuery:g})=>{Object(n.n)(()=>{mn(()=>{p()})});const v=Object(n.m)(e=>{g({query:e})},[g]),E=Object(n.p)(()=>{const e=o?o.filter(e=>e!==s):[];if(!i)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(d.Z)(t);return a&&Object(be.a)(a,i)});return Object(d.W)(Object(u.o)([...a,...h?h.map(e=>e.id):[],...b?b.map(e=>e.id):[]]),l,t)},[o,i,h,b,l,t,s]),f=Object(n.m)(()=>{t.length&&(g({query:""}),c())},[t,g,c]),O=Object(T.a)();return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,O("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(an,{itemIds:E,selectedIds:t,filterValue:i,filterPlaceholder:O("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:m,onSelectedIdsChange:a,onFilterChange:v}),n.a.createElement(qt,{isShown:Boolean(t.length),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var un=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(T.a)(),[m,d]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,p]=Object(n.r)(),[g,v]=Object(n.r)(),E=c===s.a.InProgress,f=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");d(a),a!==t&&(e.currentTarget.value=a)},[]),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{m.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:m,photo:b,memberIds:t}):v("Chat title can't be empty")},[m,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{m.length?o({title:m,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[m,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==g&&"Channel title can't be empty"!==g?g:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Gt.a,{onChange:p,title:i("AddPhoto")}),n.a.createElement(Ee.a,{value:m,onChange:f,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===g||"Channel title can't be empty"===g?g:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(Ee.a,{value:u,onChange:O,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:e}))))),n.a.createElement(qt,{isShown:0!==m.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(267);const hn=Object.keys(s.d).length/2;var bn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(x.a,{id:"NewChat",name:o.f?"slide-layers":"push-slide",renderCount:hn,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(dn,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(un,{isChannel:e,memberIds:r,onReset:c});default:return}})}),pn=a(178);a(268);var gn=Object(n.h)(({onReset:e})=>{const t=Object(T.a)();return n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:e,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,t("ArchivedChats"))),n.a.createElement(pn.a,{folderType:"archived",noChatsText:"Archive is empty."}))});const vn={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0},En=e=>{e.preventDefault()};function fn(e){vn[e.key]&&En(e)}function On(){document.addEventListener("wheel",En,{passive:!1}),window.ontouchmove=En,document.onkeydown=fn}function jn(){document.removeEventListener("wheel",En),window.ontouchmove=null,document.onkeydown=null}var Cn=a(49),yn=a(160);function kn(e,t){return e?"Copy Selected Text":t?"Copy Text":"Copy"}var Nn=a(164),In=a(48);a(269);var Sn=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:m,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:p,canCopy:g,canCopyLink:v,canSelect:E,onReply:f,onEdit:O,onPin:j,onUnpin:C,onForward:y,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:F,onCloseAnimationEnd:L,onCopyLink:A})=>{Object(n.n)(()=>{Object(k.b)(200)},[e]);const D=function(e,t,a){const n=[],c=Object(d.N)(e),s=Object(d.G)(e),l=Object(d.D)(e,"inline"),o=s&&l&&yn.a,i=window.getSelection();if(o&&n.push({label:"Copy Media",handler:()=>{Cn.b(l,r.ApiMediaFormat.BlobUrl).then(yn.b),t&&t()}}),c){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:kn(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(yn.c)(a),t&&t()}})}return a&&n.push({label:"CopyMessageLink",handler:()=>{a(),t&&t()}}),n}(t,F,v?A:void 0),B=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),x=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),U=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:R,positionY:G,style:q}=Object(Nn.a)(a,B,x,U,10,document.querySelector(".MiddleHeader").offsetHeight),z=Object(T.a)();return n.a.createElement(In.a,{isOpen:e,positionX:R,positionY:G,style:q,className:"MessageContextMenu fluid",onClose:F,onCloseAnimationEnd:L},c&&n.a.createElement(V.a,{icon:"send-outline",onClick:P},z("MessageScheduleSend")),s&&n.a.createElement(V.a,{icon:"schedule",onClick:M},z("MessageScheduleEditTime")),l&&n.a.createElement(V.a,{icon:"reply",onClick:f},z("Reply")),o&&n.a.createElement(V.a,{icon:"edit",onClick:O},z("Edit")),b&&n.a.createElement(V.a,{icon:"favorite",onClick:I},z("AddToFavorites")),p&&n.a.createElement(V.a,{icon:"favorite",onClick:S},z("Stickers.RemoveFromFavorites")),g&&D.map(e=>n.a.createElement(V.a,{key:e.label,icon:"copy",onClick:e.handler},z(e.label))),i&&n.a.createElement(V.a,{icon:"pin",onClick:j},z("DialogPin")),m&&n.a.createElement(V.a,{icon:"unpin",onClick:C},z("DialogUnpin")),h&&n.a.createElement(V.a,{icon:"forward",onClick:y},z("Forward")),E&&n.a.createElement(V.a,{icon:"select",onClick:w},z("Common.Select")),u&&n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:N},z("Delete")))};var wn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(m.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:d,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:p,canSelect:g}=n&&Object(m.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&d,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&p,canSelect:g}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:m,canReply:d,canPin:u,canUnpin:h,canDelete:b,canEdit:p,canForward:g,canFaveSticker:v,canUnfaveSticker:E,canCopy:f,canCopyLink:O,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(Q.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[D,B]=Object(n.r)(!1),[x,U]=Object(n.r)(!1),[G,q,z]=Object(Be.a)(),$=Object(n.m)(()=>{T(!1),B(!0)},[]),H=Object(n.m)(()=>{T(!1),s()},[s]),V=Object(n.m)(()=>{B(!1),s()},[s]),W=Object(n.m)(()=>{U(!1),s()},[s]),Y=Object(n.m)(()=>{z(),s()},[z,s]),K=Object(n.m)(()=>{C({messageId:a.id}),H()},[C,a.id,H]),Z=Object(n.m)(()=>{y({messageId:a.id}),H()},[y,a.id,H]),_=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),H()},[k,a.id,H]),J=Object(n.m)(()=>{if(H(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,H,c]),ee=Object(n.m)(()=>{H(),I({sticker:a.content.sticker})},[H,a.content.sticker,I]),te=Object(n.m)(()=>{H(),S({sticker:a.content.sticker})},[H,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),H()},[H,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),H()},[H,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),H()},[H,F,a.chatId,a.id]);if(Object(n.n)(()=>(On(),jn),[]),o)return void H();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(Sn,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:m,canReply:d,canDelete:b,canPin:u,canUnpin:h,canEdit:p,canForward:g,canFaveSticker:v,canUnfaveSticker:E,canCopy:f,canCopyLink:O,canSelect:j,onReply:K,onEdit:Z,onPin:_,onUnpin:X,onForward:J,onDelete:$,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:H,onCopyLink:se}),n.a.createElement(Ae,{isOpen:D,isSchedule:"scheduled"===t,onClose:V,album:c,message:a}),n.a.createElement(Te,{isOpen:x,messageId:a.id,chatId:a.chatId,onClose:W}),n.a.createElement(Le,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(R.k)(le),isFutureMode:!0,onClose:Y,onSubmit:re}))}));a(270);var Pn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(m.ub)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),{observe:m}=Object(sa.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const d=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),u=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(ve.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title:"Sticker Set"},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(ha,{sticker:e,size:l.qb,observeIntersection:m,onClick:d,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(U.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:u},`${a.installedDate?"Remove":"Add"} ${a.count} stickers`))):n.a.createElement(ge.a,null))})),Mn=a(115);a(271);var Fn=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(d.lb)(a.id),canDeleteChat:Object(d.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:m,chat:d,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:p,onSearchClick:g,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:f,enterMessageSelectMode:O})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(Q.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{f({chatId:e,isMuted:!h}),w()},[e,w,h,f]),F=Object(n.m)(()=>{p(),w()},[w,p]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{O(),w()},[w,O]);Object(n.n)(()=>(On(),jn),[]);const D=Object(T.a)();return n.a.createElement(Mn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(In.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.f&&r&&n.a.createElement(V.a,{icon:c?"channel":"group",onClick:F},D(c?"Subscribe":"Join Group")),o.f&&s&&n.a.createElement(V.a,{icon:"search",onClick:L},D("Search")),l&&n.a.createElement(V.a,{icon:h?"unmute":"mute",onClick:M},D(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(V.a,{icon:"select",onClick:A},D("ReportSelectMessages")),m&&n.a.createElement(V.a,{destructive:!0,icon:"delete",onClick:S},D(u?"Delete":b?"Delete and Leave":"Leave"))),d&&n.a.createElement($e.a,{isOpen:y,onClose:P,chat:d})))})),Ln=a(144);a(272);const An=Object(K.a)(e=>e(),200,!1);var Tn=Object(n.h)(Object(c.h)(e=>{const t=Object(m.r)(e);if(!t)return{};const{query:a,results:n}=Object(m.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","searchMessagesByDate"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,setLocalTextSearchQuery:s,searchTextMessagesLocal:l,focusMessage:o,closeLocalTextSearch:i,searchMessagesByDate:m})=>{const d=Object(n.q)(null),[u,h]=Object(n.r)(0),[b,p,g]=Object(Be.a)();Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===d.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&r&&r.length?(o({chatId:t.id,messageId:r[r.length-1]}),h(0)):h(-1)},[t,o,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==d.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||d.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[b]);const v=Object(n.m)(e=>{s({query:e}),e.length&&An(l)},[l,s]),E=Object(n.m)(e=>{m({timestamp:e.valueOf()/1e3}),g()},[g,m]),f=Object(n.m)(()=>{if(t&&r){const e=u+1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),O=Object(n.m)(()=>{if(t&&r){const e=u-1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),j=Object(T.a)();return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{size:"smaller",round:!0,color:"translucent",onClick:i},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Ln.a,{ref:d,value:a,onChange:v})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${u+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:p,ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:f,disabled:!r||!r.length||u===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(U.a,{round:!0,size:"smaller",color:"translucent",onClick:O,disabled:!r||!r.length||0===u},n.a.createElement("i",{className:"icon-down"}))),n.a.createElement(Le,{isOpen:b,isPastMode:!0,submitButtonLabel:j("JumpToDate"),onClose:g,onSubmit:E}))})),Dn=a(54),Bn=a(180),xn=a(169),Un=a(173);var Rn=function(e,t){const a=e.scrollTop,n=a+e.offsetHeight,c=t.offsetTop,r=c+t.offsetHeight;return c>a&&r{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(Q.a)(e,void 0,void 0,!1),m=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(qn.a)(t,e)},[s]),[d,u]=Object(n.r)(-1),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>m(t+e))},[u,m]),b=Object(n.m)((e,t=!1)=>{const a=r&&r[e];a&&c(a,t)},[r,c]),p=Object(n.m)(e=>{if(s&&s.length&&d>-1){const t=s[d];t&&(e.preventDefault(),b(t.userId,!0))}},[s,d,b]);Object(n.n)(()=>e?Object(xe.a)({onEsc:a,onUp:e=>h(-1,e),onDown:e=>h(1,e),onEnter:p,onTab:p}):void 0,[e,a,h,p]),Object(n.n)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=function(e,t,a=0,n=!1,c=!1){const r=e.scrollTop,s=r+e.offsetHeight,l="string"==typeof t?e.querySelectorAll(t):t,{length:o}=l,i=[];let m=!1;for(let e=0;e=r-a&&d<=s+a:o<=s+a&&d>=r-a)i.push(e),m=!0;else if(m&&!n)break}return{allElements:l,visibleIndexes:i}}(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Rn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object(Gn.a)(a,c[e],t,10)}}(d,l)},[d]);const g=Object(y.a)(s&&s.length?s:void 0,o),v=s&&!s.length?g:s;if(!o||v&&!v.length)return;const E=Object(le.a)("MentionMenu custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:d===t},n.a.createElement(je.a,{userId:e,avatarSize:"small",withHandle:!0}))))});a(274);var $n=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,onCaptionUpdate:o,onSend:i,onClear:m})=>{const d=Object(y.a)(e),u=e.length?e:d,h=Boolean(e.length),{isMentionMenuOpen:p,mentionFilter:g,closeMentionMenu:v,insertMention:E,mentionFilteredMembers:f}=Object(Bn.a)(a&&h,t,o,l.v,c,r,s);Object(n.n)(()=>h?Object(b.a)(m):void 0,[h,m]);const O=Object(n.m)(()=>{h&&i()},[h,i]),j=Object(T.a)();if(!u)return;const C=u.every(e=>e.mimeType.startsWith("image/")),k=u.every(e=>e.mimeType.startsWith("video/"));let N="";N=C?1===u.length?"Send Photo":`Send ${u.length} Photos`:k?1===u.length?"Send Video":`Send ${u.length} Videos`:1===u.length?"Send File":`Send ${u.length} Files`;const I=u.every(e=>e.quick);return n.a.createElement(ve.a,{isOpen:h,onClose:m,header:function(){if(u)return n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:m},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},N),n.a.createElement(U.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:O},j("Send")))}(),className:"AttachmentModal"},I?n.a.createElement("div",{className:"media-wrapper custom-scroll"},u.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},u.map(e=>n.a.createElement(xn.a,{name:e.filename,extension:Object(Dn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(zn,{isOpen:p,onClose:v,filter:g,onInsertUserName:E,filteredChatMembers:f,usersById:s}),n.a.createElement(Un.a,{id:"caption-input-text",html:t,editableInputId:l.v,placeholder:j("Caption"),onUpdate:o,onSend:i,shouldSetFocus:h})))}),Hn=a(124);a(275);var Vn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,m]=Object(n.r)([""]),[d,u]=Object(n.r)(!0),[h,p]=Object(n.r)(!1),[g,v]=Object(n.r)(!1),[E,f]=Object(n.r)(),[O,j]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),m([""]),u(!0),p(!1),v(!1),f(""),j(""),y(!1))},[e]),Object(n.n)(()=>k(c),[k,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const N=Object(n.m)((e=[])=>{m([...e,""]),requestAnimationFrame(()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),I=Object(n.m)(()=>{if(y(!1),!e)return;const a=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?N(n):m(n):N(),void y(!0);if(g&&(!O||!n[Number(O)]))return void y(!0);const c={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===O&&{correct:!0}})),...!d&&{isPublic:!0},...h&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=E&&Object(Hn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[O],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,g,O,d,h,t,N,E]),S=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?N(a):m(a)},[i,N]),w=Object(n.m)(e=>{const t=[...i];t.splice(e,1),m(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),P=Object(n.m)(e=>{j(e)},[j]),M=Object(n.m)(e=>{u(e.target.checked)},[]),F=Object(n.m)(e=>{p(e.target.checked)},[]),L=Object(n.m)(e=>{v(e.target.checked)},[]),A=Object(n.m)(e=>{13===e.keyCode&&I()},[I]),D=Object(n.m)(()=>{if(C&&!l.trim().length)return"Please enter the question"},[C,l]),B=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return"Please enter at least two options"},[C,i]),x=Object(T.a)();function R(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(Ee.a,{label:t!==i.length-1||10===i.length?"Option "+(t+1):"Add an Option",error:B(t),value:e,onChange:e=>S(t,e.currentTarget.value),onKeyPress:A}),t!==i.length-1&&n.a.createElement(U.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:"Remove option",onClick:()=>w(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(ve.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(U.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},x("NewPoll")),n.a.createElement(U.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:I},x("Create"))),className:"PollModal"},n.a.createElement(Ee.a,{ref:c,label:x("AskAQuestion"),value:l,error:D(),onChange:e=>o(e.currentTarget.value),onKeyPress:A}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return g&&(!O||!e[Number(O)])&&n.a.createElement("p",{className:"error"},"Please choose the correct answer")}(),g?n.a.createElement(oa.a,{name:"correctOption",options:R().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:P}):R()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(aa.a,{label:x("PollAnonymous"),checked:d,onChange:M}),n.a.createElement(aa.a,{label:x("PollMultiple"),checked:h,disabled:g,onChange:F}),n.a.createElement(aa.a,{label:x("PollQuiz"),checked:g,disabled:h,onChange:L}),g&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,onChange:e=>f(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},"Users will see this comment after choosing a wrong answer, good for educational purposes."))))});let Wn;function Yn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Wn&&(clearTimeout(Wn),Wn=void 0),e&&!o.k&&(Wn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Wn&&(clearTimeout(Wn),Wn=void 0),Wn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Kn=a(68),Zn=a(145);a(276);var Qn=Object(n.h)(({emoji:e,onClick:t})=>{const a=Object(n.m)(()=>{t(e.native,e.id)},[e,t]);return n.a.createElement("div",{className:"EmojiButton",onClick:a,title:e.colons},o.c?e.native:n.a.createElement("img",{src:`/img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var _n=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(sa.c)(l,c);const{transitionClassNames:i}=Object(Q.a)(r,void 0,void 0,"slow"),m=Object(T.a)(),d=o.f?Math.floor((I.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/d);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},m("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(le.a)("symbol-set-container",i),style:`height: ${u}px;`},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(Qn,{key:c.id,emoji:c,onClick:s})})))});a(277);const Xn={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},Jn=[];let ec,tc,ac;var nc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]),(e,t)=>Object(u.l)(t,["addRecentEmoji"]))(({className:e,onEmojiSelect:t,recentEmojis:c,addRecentEmoji:r})=>{const s=Object(n.q)(null),i=Object(n.q)(null),[m,d]=Object(n.r)(),[u,h]=Object(n.r)(),[b,p]=Object(n.r)(0),{observe:g}=Object(sa.a)({rootRef:s,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));Jn[a]=e.isIntersecting});const t=Jn.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&p(t[Math.floor(t.length/2)].index)});Object(Ve.a)(i,!o.f),Object(n.n)(()=>{if(!m)return;const e=i.current;if(!e)return;const t=42*b-e.offsetWidth/2+21;Object(Zn.a)(e,t)},[m,b]);const v=Object(T.a)(),E=Object(n.p)(()=>{if(!m)return qe.a;const e=[...m];return c&&c.length&&e.unshift({id:"recent",name:v("RecentStickers"),emojis:c}),e},[m,v,c]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(ac.categories),h(ac.emojis)};ac?e():async function(){ec||(ec=a.e(9).then(a.t.bind(null,306,3)),tc=(await ec).default,ac=Object(Kn.b)(tc));return ec}().then(e)},200)},[]);const f=Object(n.m)(e=>{p(e);const t=document.getElementById("emoji-category-"+e);Object(Gn.a)(s.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e),r({emoji:a})},[r,t]),j=Object(ot.a)([],l.P);const C=Object(le.a)("EmojiPicker",e);return u&&j?n.a.createElement("div",{className:C},n.a.createElement("div",{ref:i,className:"EmojiPicker-header"},E.map((function(e,t){const a=Xn[e.id];return a&&n.a.createElement(U.a,{className:"symbol-set-button "+(t===b?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>f(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:s,className:"EmojiPicker-main no-selection no-scrollbar"},E.map((e,t)=>n.a.createElement(_n,{category:e,index:t,allEmojis:u,observeIntersection:g,shouldRender:b>=t-1&&b<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:C},n.a.createElement(ge.a,null))}));const cc=o.f?8:16;var rc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const m=Object(n.q)(null);Object(sa.c)(m,c);const{transitionClassNames:d}=Object(Q.a)(r,void 0,void 0,"slow"),u=o.f?Math.floor((I.a.get().width-8)/(l.rb+cc)):5,h=Math.ceil(e.count/u)*(l.rb+cc);return n.a.createElement("div",{ref:m,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(le.a)("symbol-set-container",d),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(ha,{key:a.id,sticker:a,size:l.rb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(278);const sc=[];var lc=Object(n.h)(Object(c.h)(e=>{const{setsById:t,added:a,recent:n,favorite:c}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:c.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:m,loadStickerSets:d,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:p,unfaveSticker:g})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[f,O]=Object(n.r)(0),{observe:j}=Object(sa.a)({rootRef:v,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));sc[a]=e.isIntersecting});const t=sc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&O(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(sa.a)({rootRef:E}),y=Object(T.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:qe.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(d(),u(),h())},[t,h,u,d]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(Ve.a)(E),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*f-(e.offsetWidth/2-26);Object(Zn.a)(e,t)},[k,f]);const S=Object(n.m)(e=>{O(e);const t=document.getElementById("sticker-set-"+e);Object(Gn.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{m(e),p({sticker:e})},[p,m]),P=Object(n.m)(e=>{g({sticker:e})},[g]),M=Object(ot.a)([],l.ib);const F=Object(le.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:F},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(le.a)("symbol-set-button sticker-set-button",t===f&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(U.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>S(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(da,{stickerSet:e,observeIntersection:C}):n.a.createElement(ua,{stickerSet:e,observeIntersection:C})):n.a.createElement(ha,{key:e.id,sticker:a,size:l.sb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(rc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:f>=a-1&&f<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:F},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(279);function oc(){return(oc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o="gif"+e.id,i=Object(sa.b)(s,t)&&!a,m=Object(v.a)(o+"?size=m",!i,r.ApiMediaFormat.BlobUrl),d=Object(j.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),u=m||d,h=Object(v.a)(o,!i,r.ApiMediaFormat.BlobUrl),b=Boolean(i&&h),{transitionClassNames:p}=Object(ia.a)(u||h,"slow"),{isBuffered:g,bufferingHandlers:E}=Object(_.a)(!0),f=i&&!g;Object(J.a)(l,[b]);const O=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),C=Object(le.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(sa.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const m=Object(ot.a)([],l.ib);return n.a.createElement("div",{ref:o,className:Object(le.a)("GifPicker no-scrollbar",e)},a?m&&c&&c.length?c.map(e=>n.a.createElement(ic,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):m&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let dc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(dc||(dc={}));const uc=Object.values(dc).filter(e=>"string"==typeof e),hc={[dc.Emoji]:"icon-smile",[dc.Stickers]:"icon-stickers",[dc.GIFs]:"icon-gifs"};var bc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{function r(a){return n.a.createElement(U.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:uc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:hc[a]}))}const s=Object(n.m)(()=>{c(e===dc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()}},e!==dc.Emoji&&n.a.createElement(U.a,{className:"symbol-search-button",ariaLabel:e===dc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:s},n.a.createElement("i",{className:"icon-search"})),r(dc.Emoji),r(dc.Stickers),r(dc.GIFs),e===dc.Emoji&&n.a.createElement(U.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(281);let pc=!1;var gc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:m})=>{const[d,u]=Object(n.r)(0),[h,b]=Yn(e,c),{shouldRender:p,transitionClassNames:g}=Object(Q.a)(e,c,!1,!1);!pc&&e&&(pc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.f)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(K.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const v=Object(n.m)(e=>{c(),m(e)},[c,m]),E=Object(T.a)(),{canSendStickers:f,canSendGifs:O}=t;function j(t,a){switch(d){case dc.Emoji:return n.a.createElement(nc,{className:"picker-tab",onEmojiSelect:r});case dc.Stickers:return n.a.createElement(lc,{className:"picker-tab",loadAndPlay:!!f&&(e&&(t||a)),canSendStickers:f,onStickerSelect:s});case dc.GIFs:return n.a.createElement(mc,{className:"picker-tab",loadAndPlay:!!O&&(e&&(t||a)),canSendGifs:O,onGifSelect:l})}}const C=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},pc&&n.a.createElement(x.a,{name:"slide",activeKey:d,renderCount:uc.length},j)),o.f&&n.a.createElement(U.a,{round:!0,faded:!0,color:"translucent",ariaLabel:E("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(bc,{activeTab:d,onSwitchTab:u,onRemoveSymbol:i,onSearchOpen:v}));if(o.f){if(!p)return;const e=Object(le.a)("SymbolMenu mobile-menu",g);return n.a.createElement(Mn.a,null,n.a.createElement("div",{className:e},C))}return n.a.createElement(In.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.k?void 0:h,onMouseLeave:o.k?void 0:b,noCloseOnBackdrop:!o.k},C)});a(282);var vc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Yn(e,r),m=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),d=Object(n.m)(()=>{Oa(l.k,e=>m(e,!0))},[m]),u=Object(n.m)(()=>{Oa("*",e=>m(e,!1))},[m]),h=Object(T.a)(),{canAttachMedia:b,canAttachPolls:p}=t;return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.k?void 0:s,onMouseLeave:o.k?void 0:i,noCloseOnBackdrop:!o.k},!b&&n.a.createElement(V.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),b&&n.a.createElement(n.a.Fragment,null,n.a.createElement(V.a,{icon:"photo",onClick:d},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(V.a,{icon:"document",onClick:u},"Document")),p&&n.a.createElement(V.a,{icon:"poll",onClick:c},h("Poll")))});a(283);var Ec=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(Q.a)(e,void 0,void 0,!1),m=Object(y.a)(a,!0),d=a||m,{observe:u}=Object(sa.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(le.a)("EmojiTooltip custom-scroll",i);return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.k?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.k?void 0:()=>{document.body.classList.remove("no-select")}},s&&d?d.map(e=>n.a.createElement(ha,{key:e.id,sticker:e,size:l.rb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(ge.a,null):void 0)}));a(284);var fc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(m.y)(e)||{};return a?{message:Object(m.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Yn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.k?void 0:r,onMouseLeave:o.k?void 0:s,noCloseOnBackdrop:!o.k},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(U.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(285);var Oc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Yn(e,c),i=Object(T.a)();return n.a.createElement(In.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.k?void 0:s,onMouseLeave:o.k?void 0:l,noCloseOnBackdrop:!o.k},t&&n.a.createElement(V.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(V.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),jc=a(125),Cc=a(154),yc=a(162);a(286);var kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),n=a&&Object(m.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(m.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return qe.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(m.Db)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(d.jb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(m.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(m.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]);return n.a.createElement(fe.a,{className:"RightSearch custom-scroll",items:b,preloadBackwards:0,onLoadMore:i,noFastList:!0},n.a.createElement("p",{className:"helper-text"},s?1===l?"1 message found":(b.length&&(l||b.length)||"No")+" messages found":"Search messages"),b.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(d.l)(a):Object(d.Z)(t),l=Object(d.M)(e);return n.a.createElement(Oe.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(q.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",null,r&&Object(G.a)(r)),n.a.createElement(yc.a,{message:e})),n.a.createElement("div",{className:"subtitle"},Object(G.a)(l,["emoji","highlight"],{highlight:s}))))}))}));var Nc=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(m.ub)(e,t),shouldPlay:Object(m.tb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const m=a&&Boolean(a.installedDate),d=Boolean(a&&a.stickers),[u,h,b]=Object(Be.a)();Object(O.a)(()=>{i(u)},[u,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!d&&p.length<5&&r({stickerSetId:e})},[d,p.length,r,e]);const g=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const v=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set"},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title"},a.title),n.a.createElement("p",{className:"count"},a.count," stickers")),n.a.createElement(U.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:g},m?"Added":"Add")),n.a.createElement("div",{className:"sticker-set-main"},!v&&n.a.createElement(D.a,null),v&&p.map(e=>n.a.createElement(ha,{sticker:e,size:l.tb,observeIntersection:t,noAnimate:!c||u||o,onClick:h}))),v&&n.a.createElement(pa.a,{isOpen:u,fromSticker:p[0],onClose:b}))}));a(287);const Ic=Object(K.g)(e=>e(),6e4,!0);var Sc=Object(n.h)(Object(c.h)(e=>{const t=Object(m.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),[s,l]=Object(n.r)(!1),{observe:o}=Object(sa.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Ic(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll"},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Nc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):a?a.length?a.map(e=>n.a.createElement(Nc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):n.a.createElement("p",{className:"helper-text"},"Nothing found."):n.a.createElement(ge.a,null)}())}));a(288);var wc=Object(n.h)(Object(c.h)(e=>{const t=Object(m.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(m.y)(e)||{},r=c?Object(m.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(m.N)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:m}=Object(sa.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(d.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.k&&l({query:void 0})},[u,s,l]),b=Object(T.a)();const p=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch"},n.a.createElement(fe.a,{ref:i,className:Object(le.a)("gif-container custom-scroll",p&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(ic,{key:e.id,gif:e,observeIntersection:m,onClick:h})):n.a.createElement("p",{className:"helper-text"},b("NoGIFsFound")):n.a.createElement(ge.a,null)}()))}));a(289);let Pc,Mc;function Fc(e){return fetch(e).then(e=>e.json())}function Lc(e,t){const a=new Date(t),n=a.getMonth()+1,c=a.getDate();return Fc(`${e}/${`${a.getFullYear()}-${n<10?"0":""}${n}/${c<10?"0":""}${c}`}.json`)}var Ac=Object(n.h)(()=>{const e=Object(n.q)(null),[t,c]=Object(n.r)(!1),[r,s]=Object(n.r)(0);return Object(n.n)(()=>{(async()=>{if(await async function(){return Pc||(Pc=a.e(6).then(a.bind(null,307)),Mc=await Pc),Pc}(),!t)return void c(!0);const n=await Fc("./chartDummyData/growth.json");Mc.create(e.current.children[0],n),s(1);const r=await Fc("./chartDummyData/notifications.json");r.onZoom=e=>Lc("chartDummyData/notifications_zoom",e),Mc.create(e.current.children[1],r),s(2);const l=await Fc("./chartDummyData/interactions.json");Mc.create(e.current.children[2],l),s(3);const o=await Fc("./chartDummyData/views.json");o.onZoom=e=>Lc("chartDummyData/views_zoom",e),Mc.create(e.current.children[3],o),s(4);const i=await Fc("./chartDummyData/languages.json");Mc.create(e.current.children[4],i),s(5)})()},[t]),n.a.createElement("div",{className:Object(le.a)("Statistics custom-scroll",t&&"ready"),ref:e},t?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:Object(le.a)("chat-container",r<1&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<2&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<3&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<4&&"hidden")}),n.a.createElement("div",{className:Object(le.a)("chat-container",r<5&&"hidden")})):n.a.createElement(ge.a,null))});a(290);var Tc=Object(n.h)(Object(c.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:m})=>{const d=Object(y.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:p,text:g}=a;Object(n.n)(()=>{b&&d===c.votersCount||o({chat:e,messageId:t.id,option:p,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const v=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:p,offset:l,limit:50})},[e,o,t.id,l,p]);Object(n.n)(()=>{h(!1)},[s]);const E=Object(n.m)(e=>{i({id:e}),m()},[m,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},s?s.map(e=>n.a.createElement(Oe.a,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},n.a.createElement(je.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(ge.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Xt,{count:e,itemName:"voter",isLoading:u,onClick:v})}()),n.a.createElement("div",{className:"answer-head"},n.a.createElement("span",{className:"answer-title"},g),n.a.createElement("span",{className:"answer-percent"},(f=c.votersCount,(O=r)>0?(f/O*100).toFixed():0),"%")));var f,O}));a(291);var Dc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(m.f)(e,t),message:Object(m.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{if(!t||!e)return n.a.createElement(ge.a,null);const{summary:c,results:r}=Object(d.H)(t);if(!r.results)return;const s=Object(u.c)(r.results,"option");return n.a.createElement("div",{className:"PollResults"},n.a.createElement("h3",{className:"poll-question"},c.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&c.answers.map(a=>n.a.createElement(Tc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:s[a.option],totalVoters:r.totalVoters})),!a&&n.a.createElement(ge.a,null)))}));a(156);var Bc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(m.Db)(e,t),n=Object(m.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:m})=>{const[d,u,h]=Object(Be.a)(),[b,p]=Object(n.r)(!1),[g,v]=Object(n.r)(),E=Object(T.a)(),f=t&&t.firstName||"",O=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(f),[k,N]=Object(n.r)(O),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{p(!1),h()},[h,e]),Object(n.n)(()=>{y(f),N(O)},[f,O,t]),Object(n.n)(()=>{c===s.f.Complete&&(p(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),p(!0)},[]),F=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),L=Object(n.m)(()=>{a.lastMessage&&o({chatId:a.id,maxId:a.lastMessage.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),m({id:void 0})},[a.id,a.lastMessage,h,i,o,l,m,e]);if(!t)return;const A=c===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(je.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withMediaViewer:!0,withFullInfo:!0}),n.a.createElement(Ee.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===g?g:void 0}),n.a.createElement(Ee.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(qt,{isShown:b,onClick:F,disabled:A,ariaLabel:E("Save")},A?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:d,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:L,confirmIsDestructive:!0}))}));var xc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(d.ib)(a),hasLinkedChannel:c,canChangeInfo:Object(d.q)(a,"changeInfo"),canBanUsers:Object(d.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:m,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:p,deleteChannel:g,closeManagement:E,openChat:f})=>{const[O,j,C]=Object(Be.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[F,L]=Object(n.r)(),[A,B]=Object(n.r)(),x=Object(d.f)(t),U=Object(v.a)(x,!1,r.ApiMediaFormat.BlobUrl),R=Object(T.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),B(void 0))},[a]);const q=Object(n.m)(()=>{m(s.g.ChatPrivacyType)},[m]),z=Object(n.m)(()=>{m(s.g.Discussion)},[m]),$=Object(n.m)(()=>{m(s.g.GroupPermissions)},[m]),H=Object(n.m)(()=>{m(s.g.ChatAdministrators)},[m]),V=Object(n.m)(e=>{L(e),I(!0)},[]),W=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),Y=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:F}):B("Group title can't be empty")},[P,e,F,S,h]),Z=Object(n.m)(()=>{m(s.g.GroupMembers)},[m]),Q=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),_=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):t.isCreator?g({chatId:t.id}):p({chatId:t.id}),C(),E(),f({id:void 0})},[c,t.isCreator,t.id,t.lastMessage,C,E,b,p,g,f]);if(t.isRestricted)return;const ee=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:U,onChange:V,disabled:!o}),n.a.createElement(Ee.a,{id:"group-title",label:R("GroupName"),onChange:W,value:S,error:"Group title can't be empty"===A?A:void 0,disabled:!o}),n.a.createElement(Ee.a,{id:"group-about",className:"mb-2",label:R("DescriptionPlaceholder"),onChange:Y,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Oe.a,{icon:"lock",ripple:!0,onClick:q},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?R("TypePublic"):R("TypePrivate")))),l&&n.a.createElement(Oe.a,{icon:"message",ripple:!0,onClick:z},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},R("DiscussionUnlink")))),n.a.createElement(Oe.a,{icon:"permissions",ripple:!0,onClick:$,disabled:!i},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("ChannelPermissions")),n.a.createElement("span",{className:"subtitle"},_,"/",8))),n.a.createElement(Oe.a,{icon:"admin",ripple:!0,onClick:H},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(ma.a)(X))))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"group",ripple:!0,onClick:Z},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},R("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(ma.a)(t.membersCount)))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(aa.a,{checked:!t.fullInfo.isPreHistoryHidden,label:R("ChatHistory"),onChange:Q,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},R("DeleteMega")))),n.a.createElement(qt,{isShown:N,onClick:K,disabled:ee,ariaLabel:R("Save")},ee?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:O,onClose:C,textParts:Object(G.a)(c||!t.isCreator?R("AreYouSureDeleteAndExit"):R("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?R("DeleteMega"):R("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var Uc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),h=Object(T.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),p=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),g=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),m(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),m(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const c=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!c)return e;const r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete-user",ripple:!0,narrow:!0,onClick:b},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},f)))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},h("PrivacyExceptions")),n.a.createElement(Oe.a,{icon:"add-user",ripple:!0,onClick:p},h("ChannelAddException")),O.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>g(e)},n.a.createElement(je.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(qt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:d},d?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var Rc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(T.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(d.Z)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(je.a,{userId:e.userId,status:s(e)}))))))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(d.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:m,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:p})=>{const g=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",f=t&&t.fullInfo&&t.fullInfo.linkedChatId,[O,j,C]=Object(Be.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(g),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[F,L]=Object(n.r)(),A=t&&Object(d.f)(t),B=Object(v.a)(A,!1,r.ApiMediaFormat.BlobUrl),x=Object(T.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),L(void 0))},[a]);const U=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,R=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),$=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),H=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),V=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):L("Channel title can't be empty")},[S,e,P,N,i]),W=Object(n.m)(()=>{m({chatId:e,isEnabled:!c})},[e,c,m]),Y=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),K=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),p({id:void 0})},[t.isCreator,t.id,C,u,h,b,p]);if(t.isRestricted)return;const Z=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:B,onChange:z,disabled:!l}),n.a.createElement(Ee.a,{id:"channel-title",label:x("EnterChannelName"),onChange:$,value:N,error:"Channel title can't be empty"===F?F:void 0,disabled:!l}),n.a.createElement(Ee.a,{id:"channel-about",className:"mb-2",label:x("DescriptionPlaceholder"),onChange:H,value:S,disabled:!l}),t.isCreator&&n.a.createElement(Oe.a,{icon:"lock",ripple:!0,onClick:R},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?x("TypePublic"):x("TypePrivate")))),n.a.createElement(Oe.a,{icon:"message",ripple:!0,onClick:G,disabled:!l},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("Discussion")),n.a.createElement("span",{className:"subtitle"},x(f?"DiscussionUnlink":"Add")))),n.a.createElement(Oe.a,{icon:"admin",ripple:!0,onClick:q},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},U))),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:c,label:x("ChannelSignMessages"),onChange:W}))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"group",ripple:!0,onClick:Y},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},x("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle"},x("Subscribers",t.membersCount,"i"))))),n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?x("ChannelDelete"):x("LeaveChannel")))),n.a.createElement(qt,{isShown:y,onClick:V,disabled:Z,ariaLabel:x("Save")},Z?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:O,onClose:C,text:t.isCreator?x("ChannelDeleteAlert"):x("ChannelLeaveAlert"),confirmLabel:t.isCreator?x("ChannelDelete"):x("LeaveChannel"),confirmHandler:K,confirmIsDestructive:!0}))})),qc=a(52);var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{isUsernameAvailable:n}=Object(m.Y)(e,t);return{chat:a,isChannel:Object(d.jb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),m=e.fullInfo&&e.fullInfo.inviteLink,[d,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[p,g,v]=Object(Be.a)(),E="public"===d&&h&&c||"private"===d&&i;Object(n.n)(()=>{d&&!m&&o()},[d,m,o]);const f=Object(n.m)(e=>{u(e)},[]),O=Object(n.m)(()=>{l({username:"public"===d?h:""})},[d,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(T.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(oa.a,{selected:d,name:"channel-type",options:N,onChange:f})),"private"===d?n.a.createElement("div",{className:"section"},m?n.a.createElement(n.a.Fragment,null,n.a.createElement(qc.a,{url:m,className:"group-link",text:m}),n.a.createElement("p",{className:"section-info"},C(y+"PrivateLinkHelp")),n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:g},C("RevokeLink")),n.a.createElement(Bt.a,{isOpen:p,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(ge.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Vt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(qt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:O},I?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var $c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(m.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(d.jb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:m,linkDiscussionGroup:d,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[p,g]=Object(n.r)(),[v,E]=Object(n.r)(!1),f=Object(n.m)(()=>E(!0),[]),[O,j,C]=Object(Be.a)(),[y,k,N]=Object(Be.a)(),I=Object(T.a)(),S=c&&c.id;Object(n.n)(()=>{m()},[m]),Object(n.n)(()=>{p||Object(Kt.a)("DiscussionGroups").then(g)},[p]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),d({channelId:t,chatId:h})},[N,d,t,h]);function M(){const e=a[h];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(q.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function F(){const t=a[h];if(t)return t.hasPrivateLink?Object(G.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(G.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},p&&n.a.createElement(Zt.a,{id:"discussionGroupsDucks",size:l.lb,animationData:p,play:v,noLoop:!0,onLoad:f})),c&&n.a.createElement("div",null,n.a.createElement(Oe.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(Ce.a,{chatId:c.id})),n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(Bt.a,{isOpen:O,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(q.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(G.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Oe.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),r?r.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(Ce.a,{chatId:e}))):n.a.createElement(Xe.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help"},I("DiscussionChannelHelp2")),n.a.createElement(Bt.a,{isOpen:y,onClose:N,header:M(),textParts:F(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Hc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,m]=Object(n.r)(!1),[d,u]=Object(n.r)(!1),[h,b,p]=Object(Be.a)(),g=Object(T.a)(),v=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),m(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),m(!0)},[]),f=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),O=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4"},g("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:g("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:g("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:g("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:g("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:g("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:g("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:g("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:g("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},g("UserRestrictionsBlock")))),n.a.createElement(qt,{isShown:i,onClick:f,ariaLabel:g("Save"),disabled:d},d?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:h,onClose:p,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:O,confirmIsDestructive:!0}))}));var Vc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(d.jb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(T.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),m=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(d.Z)(t)):o("ChannelAdmin")},[o,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{icon:"recent",ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail"))))),n.a.createElement("div",{className:"section"},n.a.createElement("p",{className:"text-muted"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),i.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>m(e)},n.a.createElement(je.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.f)(e,t)}))(({chat:e})=>{const t=Object(T.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},"Admins"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.map(e=>n.a.createElement(Oe.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(aa.a,{label:"",checked:!0}),n.a.createElement(je.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(d.jb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[m,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[p,g]=Object(n.r)(!1),[v,E,f]=Object(Be.a)(),[O,j]=Object(n.r)(""),C=Object(T.a)(),y=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),g(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(g(!0),i({chatId:a.id,userId:e,adminRights:m,customTitle:O}))},[a,e,m,O,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),f())},[a.id,f,e,i]),S=Object(n.m)(e=>!Object(d.ib)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(d.Z)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!!m.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"postMessages",checked:!!m.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"editMessages",checked:!!m.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"deleteMessages",checked:!!m.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"banUsers",checked:!!m.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!!m.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!!m.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"addAdmins",checked:!!m.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"anonymous",checked:!!m.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(Ee.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:O,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(Oe.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(qt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:p},p?n.a.createElement(D.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Bt.a,{isOpen:v,onClose:f,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(d.jb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(d.W)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(d.jb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(d.W)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Oe.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>o(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Qc=Object(n.h)(Object(c.h)(e=>({managementType:Object(m.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(Bc,{key:e,userId:e});case"group":return n.a.createElement(xc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(Gc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(zc,{chatId:e});case s.g.Discussion:return n.a.createElement($c,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(Uc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(Rc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Zc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Hc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(Vc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Wc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Yc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Kc,{chatId:e})}}));const _c={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function Xc(e){return e&&_c[e]||""}const Jc=/^4[0-9]{12}(?:[0-9]{1,3})?$/,er=/^5[1-5][0-9]{11,14}$/,tr=/^2[2-7][0-9]{11,14}$/;let ar;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(ar||(ar={}));const nr={[ar.Default]:"",[ar.Visa]:"visa",[ar.Mastercard]:"mastercard"};function cr(e){return e=e.replace(/\s/g,""),Jc.test(e)?ar.Visa:er.test(e)||tr.test(e)?ar.Mastercard:ar.Default}var rr=a(55);const sr={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},lr=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:or(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:or(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function or(e){const t=Ut.a.find(({id:t})=>t===e);return t?t.name:""}function ir(e,t=400){Object(n.n)(()=>{o.k||setTimeout(()=>{Object(K.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var mr=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:m}=e,d=s||c,u=Object(le.a)("input-group",a&&"touched",s&&"error",d&&"with-label",r&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:o||c,ref:l},m),d&&t&&n.a.createElement("label",{htmlFor:t},d))});a(292);var dr=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const m=Object(T.a)();ir(l);const d=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),f=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),O=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,m("PaymentShippingAddress")),n.a.createElement(Ee.a,{ref:l,label:"Address1 (Street)",onChange:d,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(Ee.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(Ee.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(Ee.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(mr,{label:"Country",placeholder:"Country",onChange:p,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},Ut.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(Ee.a,{label:"Post Code",onChange:g,value:e.postCode,inputMode:"text",error:j.postCode})):void 0,c||t||a?n.a.createElement("h5",null,m("PaymentShippingReceiver")):void 0,c&&n.a.createElement(Ee.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(Ee.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(Ee.a,{label:"Phone number",onChange:f,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(aa.a,{label:m("PaymentShippingSave"),subLabel:m("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:O})))});a(293);var ur=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:c})=>{Object(n.n)(()=>{t&&!e.shipping&&c({type:"changeShipping",payload:t[0].id})},[t,e.shipping,c]);const r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(oa.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(294);function hr(e,t,a,c=!1){return n.a.createElement("div",{className:"price-info-item "+(c?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function br(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var pr=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:m,paymentProvider:d,shippingAddress:u,name:h,phone:b,shippingMethod:p}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>hr(e.label,e.amount,r,!1)),a&&a.map(e=>hr(e.label,e.amount,r,!1)),void 0!==s&&hr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},m&&br("icon-card",m,"Payment method"),d&&br("stripe-provider",d,"Payment provider"),u&&br("icon-location",u,"Shipping address"),h&&br("icon-user",h,"Name"),b&&br("icon-phone",b,"Phone number"),p&&br("icon-truck",p,"Shipping method")))});var gr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);c.current&&(c.current.value=t)}},[e]),s=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(Ee.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),vr=(a(295),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),Er=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var fr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);ir(c);const[r,s]=Object(n.r)(ar.Default);Object(n.n)(()=>{const t=cr(e);s(t)},[]);const l=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=cr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case ar.Mastercard:return n.a.createElement("img",{src:vr,alt:""});case ar.Visa:return n.a.createElement("img",{src:Er,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(Ee.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(296);var Or=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),m=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),d=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),p=Object(T.a)(),{formErrors:g={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,p("PaymentCardTitle")),n.a.createElement(fr,{onChange:o,value:e.cardNumber,error:g.cardNumber}),a&&n.a.createElement(Ee.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:g.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(gr,{value:e.expiry,onChange:m,error:g.expiry}),n.a.createElement(Ee.a,{label:"CVV code",onChange:d,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),c||r?n.a.createElement("h5",null,p("PaymentBillingAddress")):void 0,c&&n.a.createElement(mr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:l},Ut.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(Ee.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&n.a.createElement(aa.a,{label:p("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(176);var jr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:m}=e.payment,d=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:p,phoneRequested:g,emailRequested:v,shippingAddressRequested:E,flexible:f,phoneToProvider:O,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:p,shippingAddressRequested:E,phoneRequested:g,emailRequested:v,flexible:f,phoneToProvider:O,emailToProvider:j,currency:C,prices:y,isProviderError:d,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:m,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:m,emailRequested:d,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:p,isProviderError:g,invoiceContent:v,nativeProvider:E,prices:f,needCardholderName:O,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,F]=Nt(lr,sr),L=Xc(b),[A,B]=Object(n.r)(!1),R=Object(T.a)();Object(n.n)(()=>{(a||y||k)&&B(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)F({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(rr.a)(k);F({type:"setFormErrors",payload:{...e}})}},[y,k,F]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;F({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,F]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?yr(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(f,c,M.shipping),[a,M.shipping,f,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=cr(e);return nr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?Cr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const $=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(M);N({requestInfo:t,saveInfo:e})},[N,M]),H=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:c,billingCountry:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),V=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),W=Object(n.m)(e=>{S({step:e})},[S]),Y=Object(n.m)(()=>{switch(B(!0),a){case s.i.ShippingInfo:return $();case s.i.Shipping:return W(s.i.PaymentInfo);case s.i.PaymentInfo:return H();case s.i.Checkout:return V();default:return()=>{}}},[a,$,W,H,V]),K=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return R("PaymentShippingInfo");case s.i.Shipping:return R("PaymentShippingMethod");case s.i.PaymentInfo:return R("PaymentCardInfo");case s.i.Checkout:return R("PaymentCheckout");default:return""}},[a,R]),Z=Object(n.p)(()=>{switch(a){case s.i.Checkout:return`Pay ${L}${(q/100).toFixed(2)}`;default:return"Next Step"}},[a,q,L]);return g?n.a.createElement(ve.a,{className:"error",isOpen:e,onClose:t},"Sorry, Telegram T doesn't support payments with this provider yet. Please use one of our mobile apps to do this.",n.a.createElement(U.a,{isText:!0,onClick:t},"OK")):n.a.createElement(ve.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,K)),void 0!==a?n.a.createElement(x.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case s.i.ShippingInfo:return n.a.createElement(dr,{state:M,dispatch:F,needAddress:Boolean(i),needEmail:Boolean(d||h),needPhone:Boolean(m||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(ur,{state:M,dispatch:F,shippingOptions:c||[],currency:L});case s.i.PaymentInfo:return n.a.createElement(Or,{state:M,dispatch:F,canSaveCredentials:Boolean(!p&&l),needCardholderName:O,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(pr,{prices:f,shippingPrices:M.shipping&&c?yr(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:L});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(D.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(U.a,{type:"submit",onClick:Y,disabled:A,isLoading:A},Z)),y&&!y.field&&function(){if(y)return n.a.createElement(ve.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),y.description||"Error",n.a.createElement(U.a,{isText:!0,onClick:P},"OK"))}())}));function Cr(e,t){return e.find(({id:e})=>e===t)}function yr(e,t){const a=Cr(e,t);return a?a.prices:void 0}var kr=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:m,title:d}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:m,title:d}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:m,credentialsTitle:d,shippingMethod:u})=>{const h=Object(T.a)(),b=Xc(s),p=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,c=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(d,l,u),[l,u,d]);return n.a.createElement(ve.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header"},n.a.createElement(U.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",h("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(pr,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:m},checkoutInfo:p,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(49);const r={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function s(e){const t=r[e].replace(window.location.origin,"");return c.b("file"+t,n.ApiMediaFormat.Lottie)}},,,,function(e,t,a){"use strict";var n=a(0),c=a(8),r=a(1),s=a(14),l=a(94),o=a(32),i=a(99),m=a(16);a(142);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;var p=Object(n.h)(({file:e,onChange:t,onClose:c})=>{const[p,g]=Object(n.r)(!1);Object(n.n)(()=>{e&&(p?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.o&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(5),a.e(8)]).then(a.bind(null,304)),u=(await h).default),h}().then(()=>g(!0)))},[e,p]);const v=Object(l.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:c,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},p?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(m.a,null),n.a.createElement(o.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!b)return;const e=await b.result(d),a="string"==typeof e?e:Object(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(143);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const m=Object(c.a)(o&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:m,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(p,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,function(e,t,a){},,,,,,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(117),l=a(107);a(127);const o=[0,50],i=[0,20],m=[20,0],d=r.f?c.kb:c.jb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=Object(n.r)(),[u,h]=Object(n.r)(),[b,p]=Object(n.r)(!1),[g,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=Object(n.m)(()=>p(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!b&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(l.a,{id:"closeMonkey",size:t?c.ub:d,className:g?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.ub:d,className:g?"shown":"hidden",animationData:u,playSegment:e?i:m,noLoop:!0}))})},function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(8),l=a(32);const o=r.f?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:i,placeholder:m="Password",submitLabel:d="Next",clearError:u,onChangePasswordVisibility:h,onInputChange:b,onSubmit:p})=>{const g=Object(n.q)(null),[v,E]=Object(n.r)(""),[f,O]=Object(n.r)(!1);return Object(n.n)(()=>{r.k||setTimeout(()=>{g.current.focus()},o)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{g.current.focus(),g.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&p(v)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",v&&"touched",a&&"error")},n.a.createElement("input",{ref:g,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){a&&u();const{target:t}=e;E(t.value),O(t.value.length>=c.U),b&&b(t.value)}}),n.a.createElement("label",null,a||i||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),f&&n.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},d))})},,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){}])]); +//# sourceMappingURL=2.f7d16accfb1c79ee906b.js.map \ No newline at end of file diff --git a/dist/2.e4ac6d760c71882d981f.js.map b/dist/2.f7d16accfb1c79ee906b.js.map similarity index 99% rename from dist/2.e4ac6d760c71882d981f.js.map rename to dist/2.f7d16accfb1c79ee906b.js.map index 9cc97c8b0..3bd0bbf94 100644 --- a/dist/2.e4ac6d760c71882d981f.js.map +++ b/dist/2.f7d16accfb1c79ee906b.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/hooks/useBlurSync.ts","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionMenu.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/Statistics.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","opacity","source","createElement","img","Image","src","HTMLVideoElement","poster","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","ProfileAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","lang","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","preventDefault","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","alt","draggable","Spinner","threadId","avatarOwnerId","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","blobUrlPreview","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","dataUri","blurredRef","isChanged","useOnChange","canvas","imgToCanvas","fastBlur","getContext","toDataURL","blurredAsync","useBlur","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","active","currentUser","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatArrays","prepareChatList","chatWithSelf","pinnedChats","otherChats","chatIds","searchWords","getChatTitle","map","viewportIds","getMore","useInfiniteScroll","handleFilterChange","modalHeader","InputText","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","isDisabled","ListItem","PrivateChatInfo","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","notifications","dismissNotification","Notification","onDismiss","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedIds","selectPinnedIds","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withHandle","contextActions","useChatContextActions","handleDelete","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","handleClick","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","onSelect","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","sortSearchResults","a","b","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChats","globalUsers","localChats","localUsers","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","startsWith","MEMO_EMPTY_ARRAY","foundLocalContacts","fullName","getUserFullName","username","unique","getTranslation","sort","foundMessages","split","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","description","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","ConfirmDialog","confirmLabel","confirmHandler","confirmIsDestructive","onScreenSelect","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","archived","dispatch","onAddIncludedChats","onAddExcludedChats","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","archivedListIds","activeChatArrays","archivedChatArrays","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","isAnimated","localMediaHash","stickerSelector","thumbnail","previewBlobUrl","shouldPlay","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","RadioGroup","selected","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isBackgroundBlurred","customBackground","loadedWallpapers","loadWallpapers","uploadWallpaper","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","patternColor","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","data","rgb","context","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","containerRef","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationsSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentIsShowPreviews","isShowPreviews","handleContactNotificationChange","hasPassword","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","hash","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","getSortedUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","searchMessagesByDate","focusedIndex","setFocusedIndex","visualViewport","mainEl","activeElement","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleJumpToDate","timestamp","valueOf","handleUp","newFocusIndex","handleDown","SearchInput","isFullyVisible","viewportY1","viewportY2","y1","y2","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","visibleIndexes","allElements","selectorOrElements","margin","isDense","shouldContainBottom","isFound","findInViewport","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","onCaptionUpdate","onClear","prevAttachments","renderingAttachments","isMentionMenuOpen","mentionFilter","closeMentionMenu","insertMention","mentionFilteredMembers","useMentionMenu","EDITABLE_INPUT_MODAL_ID","sendAttachments","areAllPhotos","every","mimeType","areAllVideos","isQuick","quick","renderHeader","attachment","File","filename","extension","getFileExtension","previewData","MessageInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","colons","IS_EMOJI_SUPPORTED","loading","category","allEmojis","onEmojiSelect","useOnIntersect","emojisPerRow","ceil","emojis","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","recentEmojis","addRecentEmoji","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","allowedAttachmentOptions","handleMouseEnter","handleMouseLeave","fastRaf","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","CONTENT_TYPES_FOR_QUICK_UPLOAD","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","lovelyChartPromise","LovelyChart","fetchJson","path","fetch","response","json","fetchDayData","dataSource","isReady","setIsReady","loadedChartsCount","setLoadedChartsCount","ensureLovelyChart","growth","create","onZoom","interactions","views","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","lastMessage","maxId","status","withMediaViewer","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","file","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","substr","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","onKeyDown","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"2.e4ac6d760c71882d981f.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n document.body.removeChild(ghost);\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const ghost = createGhost(bestImageData || toImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n\n requestAnimationFrame(() => {\n document.body.classList.add('ghost-animating');\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n document.body.removeChild(ghost);\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .active .profile-info .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n case MediaViewerOrigin.ProfileAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? 'Profile photo' : formatMediaDateTime(message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\n }, []);\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_MOBILE_SCREEN) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n
\n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner ? `avatar${avatarOwner.id}.jpg` : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner) {\n return getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const blobUrlPreview = useMedia(\n getMediaHash(),\n undefined,\n avatarOwner ? ApiMediaFormat.DataUri : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(fullMediaData || blobUrlPreview, calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false))}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n
\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(photoDimensions!, hasFooter),\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: IDimensions) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectChat(global, avatarOwnerId) || selectUser(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { getChatTitle, prepareChatList, isChatPrivate } from '../../modules/helpers';\nimport { selectUser } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n currentUser?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n listIds,\n orderedPinnedIds,\n currentUser,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_MOBILE_SCREEN) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chats = useMemo(() => {\n const chatArrays = listIds ? prepareChatList(chatsById, listIds, orderedPinnedIds) : undefined;\n if (!chatArrays) {\n return undefined;\n }\n\n const chatWithSelf = currentUser ? chatsById[currentUser.id] : undefined;\n\n return [\n ...(chatWithSelf ? [chatWithSelf] : []),\n ...chatArrays.pinnedChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id),\n ...chatArrays.otherChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id),\n ];\n }, [chatsById, listIds, orderedPinnedIds, currentUser]);\n\n const chatIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (!filter || searchWords(getChatTitle(chat, currentUser), filter)))\n .map(({ id }) => id);\n }, [chats, filter, currentUser]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n const lang = useLang();\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay();\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(date: Date) {\n const day = formatHumanDate(date, true);\n\n return `Send ${day === 'Today' ? day : `on ${day}`} at ${formatTime(date)}`;\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete it just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete it for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderModalHeader() {\n return (\n
\n

{lang('PinMessageAlertTitle')}

\n
\n );\n }\n\n function renderMessage() {\n if (isChannel) {\n return

{lang('PinMessageAlertChannel')}

;\n }\n\n if (isGroup || isSuperGroup) {\n return

{lang('PinMessageAlert')}

;\n }\n\n return

{lang('PinMessageAlertChat')}

;\n }\n\n return (\n \n {renderMessage()}\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { selectPinnedIds } from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\ntype StateProps = {\n pinnedMessagesCount: number;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n function renderModalHeader() {\n return (\n
\n

{lang('UnpinAllMessages')}

\n
\n );\n }\n\n function renderMessage() {\n return

Do you want to unpin all {pinnedMessagesCount} messages in this chat?

;\n }\n\n return (\n \n {renderMessage()}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const pinnedIds = chatId ? selectPinnedIds(global, chatId) : [];\n\n return {\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n)(UnpinAllMessagesModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessagesModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessagesModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withHandle?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withHandle,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n if (!chat) {\n return undefined;\n }\n\n return (\n onClick(chatId)}\n contextActions={contextActions}\n >\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n\n return {\n chat,\n privateChatUser,\n isPinned,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n useLang();\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(message, mediaBlobUrl || mediaThumbnail, searchQuery)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(message: ApiMessage, blobUrl?: string, searchQuery?: string) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport { getTranslation } from '../../../util/langProvider';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChats?: ApiChat[];\n localUsers?: ApiUser[];\n globalChats?: ApiChat[];\n globalUsers?: ApiUser[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst sortSearchResults = (a: ApiChat | ApiUser, b: ApiChat | ApiUser) => Number(b.isVerified) - Number(a.isVerified);\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChats, localUsers, globalChats, globalUsers,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundLocalContacts = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n }).map((id) => usersById[id])\n : [];\n\n return unique([\n ...(searchWords(getTranslation('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...([\n ...foundLocalContacts,\n ...(localChats || []),\n ...(localUsers || []),\n ].sort(sortSearchResults).map((chat) => chat.id)),\n ]) as number[];\n }, [searchQuery, localContactIds, localChats, localUsers, usersById, currentUserId]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChats || !globalUsers) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return unique([...globalChats, ...globalUsers].sort(sortSearchResults).map((chat) => chat.id));\n }, [globalChats, globalUsers, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n const lang = useLang();\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreLocal ? 'Show less' : 'Show more'}\n )}\n Contacts and Chats\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreGlobal ? 'Show less' : 'Show more'}\n )}\n Global Search\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const { currentUserId, messages, lastSyncTime } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const {\n chats: globalChats,\n users: globalUsers,\n } = globalResults || {};\n const { chats: localChats, users: localUsers } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChats,\n localUsers,\n globalChats,\n globalUsers,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\n\nexport type StateProps = {\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\n\nexport function getSenderName(\n message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `You → ${getChatTitle(chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('EditProfile')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('EnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n Delete Folder\n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('EditProfile')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('GeneralSettings')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n const lang = useLang();\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('BioAbout'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n This link opens a chat with you:
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(chatsById, usersById, folder, chatIds, lang),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n
\n {folder.title}\n {folder.subtitle}\n
\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

{lang('FilterRecommended')}

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n onReset,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

{`Sorry, you can't add more than ${MAX_CHATS} chats.`}

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

{lang('FilterChatTypes')}

\n {chatTypes.map(renderChatType)}\n
\n

{lang('FilterChats')}

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\n\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FoldersState, FolderEditDispatch } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const { isAnimated } = sticker;\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: 'Send by Enter', subLabel: 'New line by Shift + Enter' },\n { value: 'ctrl-enter', label: `Send by ${IS_MAC_OS ? 'Cmd' : 'Ctrl'} + Enter`, subLabel: 'New line by Enter' },\n] : undefined;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n onScreenSelect,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const lang = useLang();\n\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

Choose the desired animations amount.

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey,\n [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBlur from '../../../hooks/useBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst ANIMATION_DURATION = 300;\n\nconst WallpaperTile: FC = ({\n wallpaper,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbDataUri = useBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n ANIMATION_DURATION,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor } from '../../../util/colors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n isBackgroundBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n onScreenSelect,\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n setSettingOption,\n loadWallpapers,\n uploadWallpaper,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setSettingOption({ customBackground: undefined, patternColor: DEFAULT_PATTERN_COLOR });\n }, [setSettingOption]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setSettingOption({ customBackground: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n setSettingOption({ patternColor: getPatternColor(color) });\n });\n }\n }, [loadedWallpapers, setSettingOption]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setSettingOption({ isBackgroundBlurred: e.target.checked });\n }, [setSettingOption]);\n\n const lang = useLang();\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { isBackgroundBlurred, customBackground } = global.settings.byKey;\n const { loadedWallpapers } = global.settings;\n\n return {\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadWallpapers', 'uploadWallpaper',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n customBackground,\n setSettingOption,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(customBackground));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n setSettingOption({\n customBackground: color,\n patternColor: getPatternColor(rgb),\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setSettingOption]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(customBackground?: string) {\n return customBackground && customBackground.startsWith('#')\n ? rgb2hsb(hex2rgb(customBackground.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n customBackground: global.settings.byKey.customBackground,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setSettingOption']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationsSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationsSettings();\n }, [loadNotificationsSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentIsShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, isShowPreviews: currentIsShowPreviews }),\n ...(setting === 'showPreviews' && { isShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n return (\n
\n
\n

{lang('AutodownloadPrivateChats')}

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationsSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n {getVisibilityValue(visibilityPrivacyLastSeen)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n {getVisibilityValue(visibilityPrivacyForwarding)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n {getVisibilityValue(visibilityPrivacyGroupChats)}\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n }));\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

{lang('AuthSessions.CurrentSession')}

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n\n {otherSessions && renderOtherSessions(otherSessions)}\n\n {otherSessions && (\n \n )};\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => ({ activeSessions: global.activeSessions }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n onScreenSelect,\n}) => {\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n const lang = useLang();\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent() {\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection() {\n return (\n <>\n \n {renderCurrentSectionContent()}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, getSortedUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return getSortedUserIds(resultIds, usersById);\n }, [filter, usersById, contactIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_MOBILE_SCREEN}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getSortedUserIds, getUserFullName } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUsers?: ApiUser[];\n globalUsers?: ApiUser[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n localContactIds,\n searchQuery,\n isSearching,\n localUsers,\n globalUsers,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds ? localContactIds.filter((id) => id !== currentUserId) : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundLocalContacts = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return getSortedUserIds(\n unique([\n ...foundLocalContacts,\n ...(localUsers ? localUsers.map((user) => user.id) : []),\n ...(globalUsers ? globalUsers.map((user) => user.id) : []),\n ]) as number[],\n usersById,\n selectedMemberIds,\n );\n }, [localContactIds, searchQuery, localUsers, globalUsers, usersById, selectedMemberIds, currentUserId]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds, setGlobalSearchQuery, onNextStep]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { users: globalUsers } = globalResults || {};\n const { users: localUsers } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUsers,\n localUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {() => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ onReset }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message);\n const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'Copy Media',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection, canImageBeCopied),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'CopyMessageLink',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'Copy Selected Text';\n }\n\n if (canImageBeCopied) {\n return 'Copy Text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst ANIMATION_DURATION = 200;\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\n\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && {lang('MessageScheduleEditTime')}}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && {lang('AddToFavorites')}}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n 'loadMessageLink',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {`${stickerSet.installedDate ? 'Remove' : 'Add'} ${stickerSet.count} stickers`}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate ? 'Delete' : (canDeleteChat ? 'Delete and Leave' : 'Leave'))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\nimport CalendarModal from '../common/CalendarModal';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n \n \n \n )}\n
\n \n \n \n \n \n \n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'searchMessagesByDate',\n ]),\n)(MobileSearchFooter));\n","function isFullyVisible(container: HTMLElement, element: HTMLElement) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const y1 = element.offsetTop;\n const y2 = y1 + element.offsetHeight;\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionMenu.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\n );\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionMenu: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionMenu custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionMenu);\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element.offsetTop;\n const y2 = y1 + element.offsetHeight;\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { EDITABLE_INPUT_MODAL_ID } from '../../../config';\n\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionMenu from './hooks/useMentionMenu';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionMenu from './MentionMenu';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onClear: () => void;\n};\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n onCaptionUpdate,\n onSend,\n onClear,\n}) => {\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n\n const {\n isMentionMenuOpen, mentionFilter,\n closeMentionMenu, insertMention,\n mentionFilteredMembers,\n } = useMentionMenu(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const lang = useLang();\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = renderingAttachments.length === 1 ? 'Send Photo' : `Send ${renderingAttachments.length} Photos`;\n } else if (areAllVideos) {\n title = renderingAttachments.length === 1 ? 'Send Video' : `Send ${renderingAttachments.length} Videos`;\n } else {\n title = renderingAttachments.length === 1 ? 'Send File' : `Send ${renderingAttachments.length} Files`;\n }\n\n const isQuick = renderingAttachments.every((a) => a.quick);\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n
\n
\n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return 'Please enter the question';\n }\n\n return undefined;\n }, [hasErrors, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return 'Please enter at least two options';\n }\n return undefined;\n }, [hasErrors, options]);\n\n const lang = useLang();\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

\n Please choose the correct answer\n

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

Options

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

Solution

\n setSolution(e.currentTarget.innerHTML)}\n />\n
\n Users will see this comment after choosing a wrong answer, good for educational purposes.\n
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, onClick }) => {\n const handleClick = useCallback(() => {\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

{lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string) => void;\n};\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis, addRecentEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef, !IS_MOBILE_SCREEN);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji);\n addRecentEmoji({ emoji: name });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n
\n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n
\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n (setGlobal, actions): DispatchProps => pick(actions, ['addRecentEmoji']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_MOBILE_SCREEN ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n
\n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useBlur from '../../hooks/useBlur';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbDataUri = useBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const previewData = previewBlobUrl || thumbDataUri;\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(previewData || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {previewData && !shouldRenderVideo && (\n \n )}\n {shouldRenderVideo && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n
\n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useState, useCallback, useEffect, useLayoutEffect,\n} from '../../../lib/teact/teact';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SymbolMenuTabs, SYMBOL_MENU_TAB_TITLES } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(SymbolMenu);\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n {lang('AttachmentMenu.PhotoOrVideo')}\n Document\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './EmojiTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst EmojiTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(EmojiTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, { FC, useMemo, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n
\n );\n };\n\n return (\n \n

\n {!query ? (\n 'Search messages'\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length)) || 'No'} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay, loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{set.count} stickers

\n
\n \n {isAdded ? 'Added' : 'Add'}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, memo, useState, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Loading from '../ui/Loading';\n\nimport './Statistics.scss';\n\ntype ILovelyChart = { create: Function };\nlet lovelyChartPromise: Promise;\nlet LovelyChart: ILovelyChart;\n\nasync function ensureLovelyChart() {\n if (!lovelyChartPromise) {\n lovelyChartPromise = import('../../lib/lovely-chart/LovelyChart') as Promise;\n LovelyChart = await lovelyChartPromise;\n }\n\n return lovelyChartPromise;\n}\n\nconst Statistics: FC = () => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const [isReady, setIsReady] = useState(false);\n const [loadedChartsCount, setLoadedChartsCount] = useState(0);\n\n useEffect(() => {\n (async () => {\n await ensureLovelyChart();\n\n if (!isReady) {\n setIsReady(true);\n return;\n }\n\n const growth = await fetchJson('./chartDummyData/growth.json');\n LovelyChart.create(containerRef.current!.children[0], growth);\n setLoadedChartsCount(1);\n\n const notifications = await fetchJson('./chartDummyData/notifications.json');\n notifications.onZoom = (timestamp: number) => fetchDayData('chartDummyData/notifications_zoom', timestamp);\n LovelyChart.create(containerRef.current!.children[1], notifications);\n setLoadedChartsCount(2);\n\n const interactions = await fetchJson('./chartDummyData/interactions.json');\n LovelyChart.create(containerRef.current!.children[2], interactions);\n setLoadedChartsCount(3);\n\n const views = await fetchJson('./chartDummyData/views.json');\n views.onZoom = (timestamp: number) => fetchDayData('chartDummyData/views_zoom', timestamp);\n LovelyChart.create(containerRef.current!.children[3], views);\n setLoadedChartsCount(4);\n\n const languages = await fetchJson('./chartDummyData/languages.json');\n LovelyChart.create(containerRef.current!.children[4], languages);\n setLoadedChartsCount(5);\n })();\n }, [isReady]);\n\n return (\n
\n {!isReady ? (\n \n ) : (\n <>\n
\n
\n
\n
\n
\n \n )}\n
\n );\n};\n\nfunction fetchJson(path: string) {\n return fetch(path).then((response) => response.json());\n}\n\nfunction fetchDayData(dataSource: string, timestamp: number) {\n const date = new Date(timestamp);\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const path = `${date.getFullYear()}-${month < 10 ? '0' : ''}${month}/${day < 10 ? '0' : ''}${day}`;\n\n return fetchJson(`${dataSource}/${path}.json`);\n}\n\nexport default memo(Statistics);\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n {getPercentage(answerVote.votersCount, totalVoters)}%\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n if (chat.lastMessage) {\n deleteHistory({\n chatId: chat.id,\n maxId: chat.lastMessage!.id,\n shouldDeleteForAll: false,\n });\n }\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, chat.lastMessage, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n\n return { user, chat, progress };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id, chat.lastMessage,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n
\n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n
\n
\n )}\n {hasLinkedChannel && (\n \n
\n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n
\n
\n )}\n \n
\n {lang('ChannelPermissions')}\n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n
\n
\n \n
\n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n
\n
\n
\n
\n \n
\n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n
\n
\n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n
\n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n
\n
\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n}) => {\n const lang = useLang();\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n
\n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n
\n
\n )}\n \n
\n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n
\n
\n \n
\n {lang('ChannelAdministrators')}\n {adminsCount}\n
\n
\n
\n \n
\n
\n
\n \n
\n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n
\n
\n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

{lang(`${langPrefix1}PrivateLinkHelp`)}

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const lang = useLang();\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n
\n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n
\n
\n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

Admins

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { getSortedUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getSortedUserIds, isChatChannel } from '../../../modules/helpers';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalErrors?: ApiError[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n {error.description || 'Error'}\n \n OK\n \n \n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return `Pay ${currencySign}${(totalPrice / 100).toFixed(2)}`;\n default:\n return 'Next Step';\n }\n }, [step, totalPrice, currencySign]);\n\n if (isProviderError) {\n return (\n \n Sorry, Telegram T doesn't support payments with this provider yet.\n Please use one of our mobile apps to do this.\n \n OK\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{ modalHeader }

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors: global.errors,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n
\n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/hooks/useBlurSync.ts","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionMenu.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/Statistics.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","opacity","source","createElement","img","Image","src","HTMLVideoElement","poster","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","ProfileAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","lang","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","preventDefault","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","alt","draggable","Spinner","threadId","avatarOwnerId","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","blobUrlPreview","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","dataUri","blurredRef","isChanged","useOnChange","canvas","imgToCanvas","fastBlur","getContext","toDataURL","blurredAsync","useBlur","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","active","currentUser","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatArrays","prepareChatList","chatWithSelf","pinnedChats","otherChats","chatIds","searchWords","getChatTitle","map","viewportIds","getMore","useInfiniteScroll","handleFilterChange","modalHeader","InputText","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","isDisabled","ListItem","PrivateChatInfo","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","notifications","dismissNotification","Notification","onDismiss","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedIds","selectPinnedIds","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withHandle","contextActions","useChatContextActions","handleDelete","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","handleClick","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","onSelect","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","sortSearchResults","a","b","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChats","globalUsers","localChats","localUsers","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","startsWith","MEMO_EMPTY_ARRAY","foundLocalContacts","fullName","getUserFullName","username","unique","getTranslation","sort","foundMessages","split","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","description","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","ConfirmDialog","confirmLabel","confirmHandler","confirmIsDestructive","onScreenSelect","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","archived","dispatch","onAddIncludedChats","onAddExcludedChats","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","archivedListIds","activeChatArrays","archivedChatArrays","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","isAnimated","localMediaHash","stickerSelector","thumbnail","previewBlobUrl","shouldPlay","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","RadioGroup","selected","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isBackgroundBlurred","customBackground","loadedWallpapers","loadWallpapers","uploadWallpaper","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","patternColor","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","data","rgb","context","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","containerRef","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationsSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentIsShowPreviews","isShowPreviews","handleContactNotificationChange","hasPassword","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","hash","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","getSortedUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","searchMessagesByDate","focusedIndex","setFocusedIndex","visualViewport","mainEl","activeElement","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleJumpToDate","timestamp","valueOf","handleUp","newFocusIndex","handleDown","SearchInput","isFullyVisible","viewportY1","viewportY2","y1","y2","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","visibleIndexes","allElements","selectorOrElements","margin","isDense","shouldContainBottom","isFound","findInViewport","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","onCaptionUpdate","onClear","prevAttachments","renderingAttachments","isMentionMenuOpen","mentionFilter","closeMentionMenu","insertMention","mentionFilteredMembers","useMentionMenu","EDITABLE_INPUT_MODAL_ID","sendAttachments","areAllPhotos","every","mimeType","areAllVideos","isQuick","quick","renderHeader","attachment","File","filename","extension","getFileExtension","previewData","MessageInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","colons","IS_EMOJI_SUPPORTED","loading","category","allEmojis","onEmojiSelect","useOnIntersect","emojisPerRow","ceil","emojis","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","recentEmojis","addRecentEmoji","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","allowedAttachmentOptions","handleMouseEnter","handleMouseLeave","fastRaf","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","CONTENT_TYPES_FOR_QUICK_UPLOAD","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","lovelyChartPromise","LovelyChart","fetchJson","path","fetch","response","json","fetchDayData","dataSource","isReady","setIsReady","loadedChartsCount","setLoadedChartsCount","ensureLovelyChart","growth","create","onZoom","interactions","views","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","lastMessage","maxId","status","withMediaViewer","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","file","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","substr","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","onKeyDown","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"2.f7d16accfb1c79ee906b.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n document.body.removeChild(ghost);\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const ghost = createGhost(bestImageData || toImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n\n requestAnimationFrame(() => {\n document.body.classList.add('ghost-animating');\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n document.body.removeChild(ghost);\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .active .profile-info .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n case MediaViewerOrigin.ProfileAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? 'Profile photo' : formatMediaDateTime(message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\n }, []);\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_MOBILE_SCREEN) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n
\n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n
\n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n
\n
\n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner ? `avatar${avatarOwner.id}.jpg` : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner) {\n return getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const blobUrlPreview = useMedia(\n getMediaHash(),\n undefined,\n avatarOwner ? ApiMediaFormat.DataUri : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(fullMediaData || blobUrlPreview, calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false))}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n
\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(photoDimensions!, hasFooter),\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: IDimensions) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n
\n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectChat(global, avatarOwnerId) || selectUser(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { getChatTitle, prepareChatList, isChatPrivate } from '../../modules/helpers';\nimport { selectUser } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n currentUser?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n listIds,\n orderedPinnedIds,\n currentUser,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_MOBILE_SCREEN) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chats = useMemo(() => {\n const chatArrays = listIds ? prepareChatList(chatsById, listIds, orderedPinnedIds) : undefined;\n if (!chatArrays) {\n return undefined;\n }\n\n const chatWithSelf = currentUser ? chatsById[currentUser.id] : undefined;\n\n return [\n ...(chatWithSelf ? [chatWithSelf] : []),\n ...chatArrays.pinnedChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id),\n ...chatArrays.otherChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id),\n ];\n }, [chatsById, listIds, orderedPinnedIds, currentUser]);\n\n const chatIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (!filter || searchWords(getChatTitle(chat, currentUser), filter)))\n .map(({ id }) => id);\n }, [chats, filter, currentUser]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n const lang = useLang();\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n
\n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n
\n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay();\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(date: Date) {\n const day = formatHumanDate(date, true);\n\n return `Send ${day === 'Today' ? day : `on ${day}`} at ${formatTime(date)}`;\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete it just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete it for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderModalHeader() {\n return (\n
\n

{lang('PinMessageAlertTitle')}

\n
\n );\n }\n\n function renderMessage() {\n if (isChannel) {\n return

{lang('PinMessageAlertChannel')}

;\n }\n\n if (isGroup || isSuperGroup) {\n return

{lang('PinMessageAlert')}

;\n }\n\n return

{lang('PinMessageAlertChat')}

;\n }\n\n return (\n \n {renderMessage()}\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { selectPinnedIds } from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\ntype StateProps = {\n pinnedMessagesCount: number;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n function renderModalHeader() {\n return (\n
\n

{lang('UnpinAllMessages')}

\n
\n );\n }\n\n function renderMessage() {\n return

Do you want to unpin all {pinnedMessagesCount} messages in this chat?

;\n }\n\n return (\n \n {renderMessage()}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const pinnedIds = chatId ? selectPinnedIds(global, chatId) : [];\n\n return {\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n)(UnpinAllMessagesModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessagesModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessagesModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withHandle?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withHandle,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n if (!chat) {\n return undefined;\n }\n\n return (\n onClick(chatId)}\n contextActions={contextActions}\n >\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n\n return {\n chat,\n privateChatUser,\n isPinned,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n useLang();\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(message, mediaBlobUrl || mediaThumbnail, searchQuery)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(message: ApiMessage, blobUrl?: string, searchQuery?: string) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport { getTranslation } from '../../../util/langProvider';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChats?: ApiChat[];\n localUsers?: ApiUser[];\n globalChats?: ApiChat[];\n globalUsers?: ApiUser[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst sortSearchResults = (a: ApiChat | ApiUser, b: ApiChat | ApiUser) => Number(b.isVerified) - Number(a.isVerified);\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChats, localUsers, globalChats, globalUsers,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundLocalContacts = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n }).map((id) => usersById[id])\n : [];\n\n return unique([\n ...(searchWords(getTranslation('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...([\n ...foundLocalContacts,\n ...(localChats || []),\n ...(localUsers || []),\n ].sort(sortSearchResults).map((chat) => chat.id)),\n ]) as number[];\n }, [searchQuery, localContactIds, localChats, localUsers, usersById, currentUserId]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChats || !globalUsers) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return unique([...globalChats, ...globalUsers].sort(sortSearchResults).map((chat) => chat.id));\n }, [globalChats, globalUsers, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n const lang = useLang();\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreLocal ? 'Show less' : 'Show more'}\n )}\n Contacts and Chats\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreGlobal ? 'Show less' : 'Show more'}\n )}\n Global Search\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const { currentUserId, messages, lastSyncTime } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const {\n chats: globalChats,\n users: globalUsers,\n } = globalResults || {};\n const { chats: localChats, users: localUsers } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChats,\n localUsers,\n globalChats,\n globalUsers,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\n\nexport type StateProps = {\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\n\nexport function getSenderName(\n message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `You → ${getChatTitle(chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('EditProfile')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('EnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n Delete Folder\n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('EditProfile')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('GeneralSettings')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n const lang = useLang();\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('BioAbout'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n This link opens a chat with you:
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(chatsById, usersById, folder, chatIds, lang),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n
\n {folder.title}\n {folder.subtitle}\n
\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

{lang('FilterRecommended')}

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n onReset,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

{`Sorry, you can't add more than ${MAX_CHATS} chats.`}

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

{lang('FilterChatTypes')}

\n {chatTypes.map(renderChatType)}\n
\n

{lang('FilterChats')}

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\n\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FoldersState, FolderEditDispatch } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const { isAnimated } = sticker;\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: 'Send by Enter', subLabel: 'New line by Shift + Enter' },\n { value: 'ctrl-enter', label: `Send by ${IS_MAC_OS ? 'Cmd' : 'Ctrl'} + Enter`, subLabel: 'New line by Enter' },\n] : undefined;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n onScreenSelect,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const lang = useLang();\n\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

Choose the desired animations amount.

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey,\n [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBlur from '../../../hooks/useBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst ANIMATION_DURATION = 300;\n\nconst WallpaperTile: FC = ({\n wallpaper,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbDataUri = useBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n ANIMATION_DURATION,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor } from '../../../util/colors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n isBackgroundBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n onScreenSelect,\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n setSettingOption,\n loadWallpapers,\n uploadWallpaper,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setSettingOption({ customBackground: undefined, patternColor: DEFAULT_PATTERN_COLOR });\n }, [setSettingOption]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setSettingOption({ customBackground: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n setSettingOption({ patternColor: getPatternColor(color) });\n });\n }\n }, [loadedWallpapers, setSettingOption]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setSettingOption({ isBackgroundBlurred: e.target.checked });\n }, [setSettingOption]);\n\n const lang = useLang();\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { isBackgroundBlurred, customBackground } = global.settings.byKey;\n const { loadedWallpapers } = global.settings;\n\n return {\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadWallpapers', 'uploadWallpaper',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n customBackground,\n setSettingOption,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(customBackground));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n setSettingOption({\n customBackground: color,\n patternColor: getPatternColor(rgb),\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setSettingOption]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(customBackground?: string) {\n return customBackground && customBackground.startsWith('#')\n ? rgb2hsb(hex2rgb(customBackground.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n customBackground: global.settings.byKey.customBackground,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setSettingOption']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationsSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationsSettings();\n }, [loadNotificationsSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentIsShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, isShowPreviews: currentIsShowPreviews }),\n ...(setting === 'showPreviews' && { isShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n return (\n
\n
\n

{lang('AutodownloadPrivateChats')}

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationsSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n {getVisibilityValue(visibilityPrivacyLastSeen)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n {getVisibilityValue(visibilityPrivacyForwarding)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n {getVisibilityValue(visibilityPrivacyGroupChats)}\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n }));\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

{lang('AuthSessions.CurrentSession')}

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n\n {otherSessions && renderOtherSessions(otherSessions)}\n\n {otherSessions && (\n \n )};\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => ({ activeSessions: global.activeSessions }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n onScreenSelect,\n}) => {\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n const lang = useLang();\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent() {\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection() {\n return (\n <>\n \n {renderCurrentSectionContent()}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, getSortedUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return getSortedUserIds(resultIds, usersById);\n }, [filter, usersById, contactIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_MOBILE_SCREEN}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getSortedUserIds, getUserFullName } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUsers?: ApiUser[];\n globalUsers?: ApiUser[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n localContactIds,\n searchQuery,\n isSearching,\n localUsers,\n globalUsers,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds ? localContactIds.filter((id) => id !== currentUserId) : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundLocalContacts = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return getSortedUserIds(\n unique([\n ...foundLocalContacts,\n ...(localUsers ? localUsers.map((user) => user.id) : []),\n ...(globalUsers ? globalUsers.map((user) => user.id) : []),\n ]) as number[],\n usersById,\n selectedMemberIds,\n );\n }, [localContactIds, searchQuery, localUsers, globalUsers, usersById, selectedMemberIds, currentUserId]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds, setGlobalSearchQuery, onNextStep]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { users: globalUsers } = globalResults || {};\n const { users: localUsers } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUsers,\n localUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {() => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ onReset }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message);\n const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'Copy Media',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection, canImageBeCopied),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'CopyMessageLink',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'Copy Selected Text';\n }\n\n if (canImageBeCopied) {\n return 'Copy Text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst ANIMATION_DURATION = 200;\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\n\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && {lang('MessageScheduleEditTime')}}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && {lang('AddToFavorites')}}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n 'loadMessageLink',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {`${stickerSet.installedDate ? 'Remove' : 'Add'} ${stickerSet.count} stickers`}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate ? 'Delete' : (canDeleteChat ? 'Delete and Leave' : 'Leave'))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\nimport CalendarModal from '../common/CalendarModal';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n \n \n \n )}\n
\n \n \n \n \n \n \n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'searchMessagesByDate',\n ]),\n)(MobileSearchFooter));\n","function isFullyVisible(container: HTMLElement, element: HTMLElement) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const y1 = element.offsetTop;\n const y2 = y1 + element.offsetHeight;\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionMenu.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\n );\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionMenu: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionMenu custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionMenu);\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element.offsetTop;\n const y2 = y1 + element.offsetHeight;\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { EDITABLE_INPUT_MODAL_ID } from '../../../config';\n\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionMenu from './hooks/useMentionMenu';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionMenu from './MentionMenu';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onClear: () => void;\n};\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n onCaptionUpdate,\n onSend,\n onClear,\n}) => {\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n\n const {\n isMentionMenuOpen, mentionFilter,\n closeMentionMenu, insertMention,\n mentionFilteredMembers,\n } = useMentionMenu(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const lang = useLang();\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = renderingAttachments.length === 1 ? 'Send Photo' : `Send ${renderingAttachments.length} Photos`;\n } else if (areAllVideos) {\n title = renderingAttachments.length === 1 ? 'Send Video' : `Send ${renderingAttachments.length} Videos`;\n } else {\n title = renderingAttachments.length === 1 ? 'Send File' : `Send ${renderingAttachments.length} Files`;\n }\n\n const isQuick = renderingAttachments.every((a) => a.quick);\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n
\n
\n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return 'Please enter the question';\n }\n\n return undefined;\n }, [hasErrors, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return 'Please enter at least two options';\n }\n return undefined;\n }, [hasErrors, options]);\n\n const lang = useLang();\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

\n Please choose the correct answer\n

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

Options

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

Solution

\n setSolution(e.currentTarget.innerHTML)}\n />\n
\n Users will see this comment after choosing a wrong answer, good for educational purposes.\n
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, onClick }) => {\n const handleClick = useCallback(() => {\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

{lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string) => void;\n};\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis, addRecentEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef, !IS_MOBILE_SCREEN);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji);\n addRecentEmoji({ emoji: name });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n
\n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n
\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n (setGlobal, actions): DispatchProps => pick(actions, ['addRecentEmoji']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_MOBILE_SCREEN ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n
\n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useBlur from '../../hooks/useBlur';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbDataUri = useBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const previewData = previewBlobUrl || thumbDataUri;\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(previewData || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {previewData && !shouldRenderVideo && (\n \n )}\n {shouldRenderVideo && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n
\n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useState, useCallback, useEffect, useLayoutEffect,\n} from '../../../lib/teact/teact';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SymbolMenuTabs, SYMBOL_MENU_TAB_TITLES } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(SymbolMenu);\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n {lang('AttachmentMenu.PhotoOrVideo')}\n Document\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './EmojiTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst EmojiTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(EmojiTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, { FC, useMemo, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n
\n );\n };\n\n return (\n \n

\n {!query ? (\n 'Search messages'\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length)) || 'No'} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay, loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{set.count} stickers

\n
\n \n {isAdded ? 'Added' : 'Add'}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, memo, useState, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Loading from '../ui/Loading';\n\nimport './Statistics.scss';\n\ntype ILovelyChart = { create: Function };\nlet lovelyChartPromise: Promise;\nlet LovelyChart: ILovelyChart;\n\nasync function ensureLovelyChart() {\n if (!lovelyChartPromise) {\n lovelyChartPromise = import('../../lib/lovely-chart/LovelyChart') as Promise;\n LovelyChart = await lovelyChartPromise;\n }\n\n return lovelyChartPromise;\n}\n\nconst Statistics: FC = () => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const [isReady, setIsReady] = useState(false);\n const [loadedChartsCount, setLoadedChartsCount] = useState(0);\n\n useEffect(() => {\n (async () => {\n await ensureLovelyChart();\n\n if (!isReady) {\n setIsReady(true);\n return;\n }\n\n const growth = await fetchJson('./chartDummyData/growth.json');\n LovelyChart.create(containerRef.current!.children[0], growth);\n setLoadedChartsCount(1);\n\n const notifications = await fetchJson('./chartDummyData/notifications.json');\n notifications.onZoom = (timestamp: number) => fetchDayData('chartDummyData/notifications_zoom', timestamp);\n LovelyChart.create(containerRef.current!.children[1], notifications);\n setLoadedChartsCount(2);\n\n const interactions = await fetchJson('./chartDummyData/interactions.json');\n LovelyChart.create(containerRef.current!.children[2], interactions);\n setLoadedChartsCount(3);\n\n const views = await fetchJson('./chartDummyData/views.json');\n views.onZoom = (timestamp: number) => fetchDayData('chartDummyData/views_zoom', timestamp);\n LovelyChart.create(containerRef.current!.children[3], views);\n setLoadedChartsCount(4);\n\n const languages = await fetchJson('./chartDummyData/languages.json');\n LovelyChart.create(containerRef.current!.children[4], languages);\n setLoadedChartsCount(5);\n })();\n }, [isReady]);\n\n return (\n
\n {!isReady ? (\n \n ) : (\n <>\n
\n
\n
\n
\n
\n \n )}\n
\n );\n};\n\nfunction fetchJson(path: string) {\n return fetch(path).then((response) => response.json());\n}\n\nfunction fetchDayData(dataSource: string, timestamp: number) {\n const date = new Date(timestamp);\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const path = `${date.getFullYear()}-${month < 10 ? '0' : ''}${month}/${day < 10 ? '0' : ''}${day}`;\n\n return fetchJson(`${dataSource}/${path}.json`);\n}\n\nexport default memo(Statistics);\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n {getPercentage(answerVote.votersCount, totalVoters)}%\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n if (chat.lastMessage) {\n deleteHistory({\n chatId: chat.id,\n maxId: chat.lastMessage!.id,\n shouldDeleteForAll: false,\n });\n }\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, chat.lastMessage, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n\n return { user, chat, progress };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id, chat.lastMessage,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n
\n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n
\n
\n )}\n {hasLinkedChannel && (\n \n
\n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n
\n
\n )}\n \n
\n {lang('ChannelPermissions')}\n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n
\n
\n \n
\n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n
\n
\n
\n
\n \n
\n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n
\n
\n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n
\n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n
\n
\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n}) => {\n const lang = useLang();\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n
\n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n
\n
\n )}\n \n
\n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n
\n
\n \n
\n {lang('ChannelAdministrators')}\n {adminsCount}\n
\n
\n
\n \n
\n
\n
\n \n
\n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n
\n
\n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

{lang(`${langPrefix1}PrivateLinkHelp`)}

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const lang = useLang();\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n
\n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n
\n
\n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

Admins

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { getSortedUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getSortedUserIds, isChatChannel } from '../../../modules/helpers';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalErrors?: ApiError[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n {error.description || 'Error'}\n \n OK\n \n \n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return `Pay ${currencySign}${(totalPrice / 100).toFixed(2)}`;\n default:\n return 'Next Step';\n }\n }, [step, totalPrice, currencySign]);\n\n if (isProviderError) {\n return (\n \n Sorry, Telegram T doesn't support payments with this provider yet.\n Please use one of our mobile apps to do this.\n \n OK\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{ modalHeader }

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors: global.errors,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n
\n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/3.b70839d141349ff143e4.css b/dist/3.4bcadbdcb5986d5c9ba9.css similarity index 100% rename from dist/3.b70839d141349ff143e4.css rename to dist/3.4bcadbdcb5986d5c9ba9.css diff --git a/dist/3.b70839d141349ff143e4.js b/dist/3.4bcadbdcb5986d5c9ba9.js similarity index 51% rename from dist/3.b70839d141349ff143e4.js rename to dist/3.4bcadbdcb5986d5c9ba9.js index 6f9381865..03d90fc56 100644 --- a/dist/3.b70839d141349ff143e4.js +++ b/dist/3.4bcadbdcb5986d5c9ba9.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{105:function(e,t,a){"use strict";function s(e){const t=e.length;let a=e[0],s=e[0];for(let n=0;na?a=t:tvoid 0!==a[s]?a[s]:void 0!==t[s]?t[s]:e[s]})}function o(e,t,a=!0){let s,n,c=null;return(...r)=>{s=!0,n=r,c||(a&&(s=!1,e(...n)),c=window.setInterval(()=>{if(!s)return window.clearInterval(c),void(c=null);s=!1,e(...n)},t))}}function i(e){let t,a=!1;return function(...s){t=s,a||(a=!0,requestAnimationFrame(()=>{a=!1,e(...t)}))}}function l(e,t,a=!0,s=!0){let n=null;return function(){n?(clearTimeout(n),n=null):a&&e(),n=setTimeout(()=>{s&&e(),n=null},t)}}a.d(t,"b",(function(){return s})),a.d(t,"c",(function(){return n})),a.d(t,"e",(function(){return c})),a.d(t,"d",(function(){return r})),a.d(t,"f",(function(){return o})),a.d(t,"g",(function(){return i})),a.d(t,"a",(function(){return l}))},185:function(e,t,a){},186:function(e,t,a){},187:function(e,t,a){},199:function(e,t,a){},200:function(e,t,a){},201:function(e,t,a){},204:function(e,t,a){},205:function(e,t,a){},206:function(e,t,a){},210:function(e,t,a){},211:function(e,t,a){},213:function(e,t,a){},216:function(e,t,a){},217:function(e,t,a){},218:function(e,t,a){},219:function(e,t,a){},220:function(e,t,a){},221:function(e,t,a){},222:function(e,t,a){},223:function(e,t,a){},224:function(e,t,a){},225:function(e,t,a){},226:function(e,t,a){},228:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},236:function(e,t,a){},237:function(e,t,a){},238:function(e,t,a){},91:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return yn}));var s=a(2),n=a(1),c=a(0),r=(a(74),a(38)),o=a(6);window.addEventListener("popstate",e=>{if(!e.state)return;const{chatId:t,threadId:a,messageListType:n}=e.state;Object(s.d)().openChat({id:t,threadId:a,type:n,noPushState:!0})}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",noPushState:l}=a,d=Object(o.y)(e);return d&&d.chatId===n&&d.threadId===c&&d.type===i||(e=Object(r.m)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),l||window.history.pushState({chatId:n,threadId:c,messageListType:i},"")),Object(r.L)(e,n,c,i)}),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0}));var i=a(5),l=a(18),d=a(3);let b;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.v)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.v)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.v)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Eb)(e,t,a);if(!s||!n)return;const c=Object(d.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.v)(e,t,a,"editingId",c):void 0}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,origin:o}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,origin:o},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(o.V)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===i.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.zb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=i.MAIN_THREAD_ID,messageListType:d="thread",noHighlight:u,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.I)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||d!==j.type;b&&(clearTimeout(b),b=void 0),b=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.N)(e),e=Object(r.M)(e),Object(s.g)(e)},2e3),e=Object(r.N)(e,n,O,u),e=Object(r.M)(e,void 0),g&&(e=Object(r.M)(e,l.b.Static));const f=Object(o.Eb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.v)(e,n,c,"viewportIds",void 0)),e=Object(r.v)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?l.b.Down:l.b.Up;e=Object(r.M)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let r;return c&&(r=Object(o.Z)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:r||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(o.r)(e);return n?Object(r.l)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.E)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.m),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(r.P)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(r.P)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.P)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.P)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.Q)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.P)(e,{chatId:s,query:void 0,resultsByType:void 0})});var u=a(44),m=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return Object(r.W)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return e=Object(r.W)(e,t,a,!1),e=Object(r.s)(e,t,a,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(m.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.s)(e,s,n,u.a)),e=Object(r.W)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.V)(e,s,n)}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(r.db)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.u)(e,a));var h=a(7),O=a(158);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("toggleStatistics",e=>({...e,isStatisticsShown:!e.isStatisticsShown})),Object(s.b)("openChat",(e,t,a)=>{if(!h.f)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(O.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(r.g)(e);return Object(r.h)(t)});a(75);var j=a(10),g=a(9);const f=Object(g.g)(e=>e(),1e3,!0),p=Object(g.g)(e=>e(),3e3,!0),I=Object(g.a)(e=>e(),500,!1,!0),v=Object(g.a)(e=>e(),500,!1,!0);async function y(e,t,a){const c=await Object(j.a)("fetchChats",{limit:n.i,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let l=Object(s.e)();l=Object(r.e)(l,Object(d.c)(c.users,"id")),l=Object(r.K)(l,Object(d.c)(c.chats,"id")),l=Object(r.G)(l,e,o),l=Object(r.H)(l,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{l=Object(r.v)(l,e,i.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{l=Object(r.v)(l,e,i.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||l.chats.isFullyLoaded[e]||(l={...l,chats:{...l.chats,isFullyLoaded:{...l.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(l)}async function w(e){const t=await Object(j.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.e)(c,Object(d.c)(a,"id"))),c=Object(r.F)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function C(e,t,a){const n=Object(s.e)(),c=Object(o.h)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(o.r)(n);e.openChat({id:-1});const l=await Object(j.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(r.F)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==l&&!a.includes(e));if(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:i.MAIN_THREAD_ID}),h.k&&t.loadPinnedMessages({chatId:u.id})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(m.mb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(j.a)("fetchChat",{type:"self"});else{const t=Object(o.Db)(e,s);t&&Object(j.a)("fetchChat",{type:"user",user:t})}if(n!==i.MAIN_THREAD_ID){Object(o.Bb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.xb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(j.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.vb})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(o.M)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;f(c?()=>y(s,c.id,c.lastMessage.date):()=>y(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?w(c):I(()=>w(c)))}),Object(s.b)("loadSuperGroupOnlines",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&v(()=>Object(j.a)("fetchSuperGroupOnlines",n))}),Object(s.b)("loadTopChats",()=>{p(()=>y("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(j.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatMutedState",{chat:c,isMuted:n})}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:d}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const c=await Object(j.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let d=Object(s.e)();d=Object(r.F)(d,o,c),d={...d,chatCreation:{...d.chatCreation,progress:c?l.a.Complete:l.a.Error}},Object(s.g)(d),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(j.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,d.map(t=>Object(o.Db)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("leaveChannel",{channelId:c,accessHash:r})}),Object(s.b)("deleteChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("deleteChannel",{channelId:c,accessHash:r})}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const n=await Object(j.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.F)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?l.a.Complete:l.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(j.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Db)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.M)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(j.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.M)(e,s,"archived"===t?n.g:void 0);Object(j.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleChatArchived",{chat:c,folderId:Object(m.hb)(c)?0:n.g})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(o.i)(e,s);c&&Object(j.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:r}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(j.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const r=Object(s.e)(),{recommended:o}=r.chatFolders;o&&Object(s.g)({...r,chatFolders:{...r.chatFolders,recommended:o.filter(({id:e})=>e!==a)}})}(c,r&&r.length?Math.max.apply(Math.max,r):n.g)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(j.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(j.a)("markMessageListRead",{chat:n,threadId:i.MAIN_THREAD_ID}):Object(j.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.bb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(j.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.cb.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;C(t,e,a)}}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;C(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(o.f)(e,s);c&&(async()=>{if(Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(j.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Db)(e,c);l&&d&&(async()=>{if(Object(m.ib)(l)){if(l=await Object(j.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(j.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.F)(e,n,{fullInfo:{...a.fullInfo,...b&&h&&{members:b.filter(e=>e.userId!==c)},...b&&!h&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Db)(e,c);d&&b&&(async()=>{if(Object(m.ib)(d)){if(d=await Object(j.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(j.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.F)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!h&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:d}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.InProgress)),await Promise.all([b.title!==c?Object(j.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(j.a)("updateChatAbout",b,i):void 0,d?Object(j.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:d}):void 0]),Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(j.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(r.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(o.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(m.ib)(r)){if(r=await Object(j.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(j.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(j.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(j.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(j.a)("setDiscussionGroup",{channel:n}),c&&w(c)})()});var E=a(159);const M=new Map;async function S(e,t,a,c,i=!1,b=!1){const u=e.id;let m;switch(c){case l.e.Backwards:m=void 0;break;case l.e.Around:m=-(Math.round(n.R/2)+1);break;case l.e.Forwards:m=-(n.R+1)}const h=await Object(j.a)("fetchMessages",{chat:Object(o.Ab)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.R,threadId:t});if(!h)return;const{messages:O,users:g,chats:f,threadInfos:p,firstMessageId:I}=h,v=Object(d.c)(O,"id"),y=Object.keys(v).map(Number);let w=Object(s.e)();w=Object(r.b)(w,u,v),w=i?Object(r.bb)(w,u,t,y):Object(r.T)(w,u,t,y),w=Object(r.e)(w,Object(d.c)(g,"id")),w=Object(r.c)(w,Object(d.c)(f,"id")),w=Object(r.jb)(w,u,p),I&&(w=Object(r.v)(w,u,t,"firstMessageId",I));let C=Object(o.X)(w,u,t);const E=Object(o.db)(w,u,t);if(i&&C&&E&&Object(d.b)(C,E)&&(w=Object(r.T)(w,u,t,E),C=Object(o.X)(w,u,t),w=Object(r.v)(w,u,t,"outlyingIds",void 0),i=!1),!b){const e=i?E:C,{newViewportIds:s}=k(e,a,c);w=Object(r.x)(w,u,t,s)}Object(s.g)(w)}function k(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,r=a===l.e.Backwards?c:c+1||s,o=r-n.R,i=r+n.R-1,d=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case l.e.Backwards:b=r>0,u=o>=0;break;case l.e.Forwards:b=r0,u=d.length===n.R}return{newViewportIds:d,areSomeLocal:b,areAllLocal:u}}async function N(e){let t;const a=e.attachment?(e,n)=>{M.has(n)||(t=n,M.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;e.replyingTo&&await Object(g.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===i.MAIN_THREAD_ID||(e.replyingTo=Object(o.Bb)(n,e.chat.id,r)),await Object(j.a)("sendMessage",e,a),a&&t&&M.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=l.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:d}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,d=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Eb)(e,i,d),m=Object(o.X)(e,i,d),h=Object(o.db)(e,i,d);if(u&&u.length&&s!==l.e.Around){const a=s===l.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=k(o,a,s);if(j&&(e=Object(r.x)(e,i,d,O)),async function(e,t,a,s,n,c,r,o){t||await S(n,c,o,r,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:r,isBudgetPreload:!0}))}(t,g,n,c,b,d,s,a),c)return}else{const t=Object(o.H)(e,i)||Object(o.ib)(e,i,d),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=k(s,t,l.e.Around);O&&u.length>=n.R&&(e=Object(r.x)(e,i,d,u)),j||S(b,d,t,l.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:l}=a,b=Object(o.f)(e,n);b&&async function(e,t,a){const n=await Object(j.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===i.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.J)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.J)(c,e.id,t,n.message),c=Object(r.e)(c,Object(d.c)(n.users,"id")),Object(s.g)(c)}(b,c,l)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:c,threadId:r,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(o.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const b={...a,chat:l,replyingTo:Object(o.jb)(e,c,r),noWebPage:Object(o.bb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=b;N({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=b,c=Object(d.n)(a,n.J);for(let a=0;a0?o:void 0}),r.forEach(e=>{N({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=b;e&&N({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{N({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(j.a)("editMessage",{chat:d,message:b,text:s,entities:n}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&M.get(c.previousLocalId||c.id);r&&Object(j.b)(r),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:l,entities:d}=c,b=Object(o.f)(e,s);return n===i.MAIN_THREAD_ID&&Object(j.a)("saveDraft",{chat:b,text:l,entities:d,replyToMsgId:Object(o.jb)(e,s,n)}),Object(r.v)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const l=Object(o.f)(e,s);return c||n!==i.MAIN_THREAD_ID||Object(j.a)("clearDraft",l),Object(r.v)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.v)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(j.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(j.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.v)(t,e.id,i.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(j.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(e,r,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(j.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{const{chatId:s,maxId:n,shouldDeleteForAll:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("deleteHistory",{chat:r,shouldDeleteForAll:c,maxId:n})}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Ab)(e,n,c);if(!r)return;const{maxId:i}=a;Object(j.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(j.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(j.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("sendPollVote",{chat:r,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:o,offset:i,limit:l,shouldResetVoters:b}=a;!async function(e,t,a,n,c,o){const i=await Object(j.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.e)(l,Object(d.c)(i.users,"id"));const{voters:b}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...b,[a]:[...!o&&b&&b[a]?b[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,o,i,l,b)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(j.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(j.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(d.c)(c,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.t)(b,e.id,o,n),b=Object(r.v)(b,e.id,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(b)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.mb)(e,r.id,n);r&&i&&Object(j.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Ab)(e,s,n);c&&Object(j.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(j.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(d.c)(a,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.b)(b,e.id,o),b=Object(r.v)(b,e.id,i.MAIN_THREAD_ID,"pinnedIds",l),b=Object(r.e)(b,Object(d.c)(c,"id")),b=Object(r.c)(b,Object(d.c)(n,"id")),Object(s.g)(b)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(j.a)("fetchMessageLink",{chat:c,message:r});e&&Object(E.c)(e.link)})()});var P=a(46);const T=Object(g.g)(e=>e(),500,!1);async function A(e,t){const a=await Object(j.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.O)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(j.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.gb)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(g.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(j.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(j.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(j.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.gb)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(o.ub)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(j.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:o}=a;let i=Object(s.e)();i=Object(r.fb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.n)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(j.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.p)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(j.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(j.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(j.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.ub)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(j.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&T(()=>{!async function(e,t=0){const a=await Object(j.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:o}=n.stickers,i=a.sets.map(({id:e})=>e);o.setIds&&o.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(P.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.gb)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&T(()=>{A(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&T(()=>{A(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;T(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(j.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.hb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var R=a(28);const x=Object(g.g)(e=>e(),500,!1);async function L(e="",t,a,c,i,l){let b;if(c){const s=await Object(j.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.x,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;b={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else b=await Object(j.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.x,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!b||""!==e&&e!==m)return void Object(s.g)(Object(r.R)(u,{messages:!1}));const{messages:h,users:O,chats:g,totalCount:f,nextRate:p}=b;g.length&&(u=Object(r.c)(u,Object(d.c)(g,"id"))),O.length&&(u=Object(r.e)(u,Object(d.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.S)(u,h,f,t,p),Object(s.g)(u)}async function F(){const e=await Object(j.a)("fetchChats",{limit:n.i,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.mb)(t,Object(d.c)(e.users,"id")),t=Object(r.K)(t,Object(d.c)(e.chats,"id")),t=Object(r.q)(t,"archived",e.chatIds),t=Object(r.H)(t,"archived",e),Object(s.g)(t)}async function D(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(o.Db)(e,t)).filter(Boolean),c=await Object(j.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.mb)(e,Object(d.c)(c,"id")),Object(s.g)(e))}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:c}=e.globalSearch,{query:i}=a;i&&!c&&x(()=>{!async function(e){const t=await Object(j.a)("searchChats",{query:e,limit:n.x});let a=Object(s.e)();const c=Object(o.t)(a);if(!t||!c||e!==c)return void Object(s.g)(Object(r.R)(a,{chats:!1}));const{localChats:i,localUsers:l,globalChats:b,globalUsers:u}=t;(i.length||b.length)&&(a=Object(r.c)(a,Object(d.c)([...i,...b],"id")));(l.length||u.length)&&(a=Object(r.e)(a,Object(d.c)([...l,...u],"id")));a=Object(r.R)(a,{chats:!1}),a=Object(r.P)(a,{localResults:{chats:i,users:l},globalResults:{...a.globalSearch.globalResults,chats:b,users:u}}),Object(s.g)(a)}(i)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(R.m)(n):n,i=Object(r.P)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;L("","text",void 0,l?Object(o.f)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:r}=e.globalSearch,i=r?Object(R.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};L(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,l=Object(o.A)(e);if(!c||!l||!a)return;const{query:b,results:u}=l,m=u?u.nextOffsetId:void 0;let h;if(a!==i.MAIN_THREAD_ID){const s=Object(o.zb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.T,offsetId:i});if(!l)return;const{messages:b,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(d.c)(b,"id"),g=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.e)(f,Object(d.c)(u,"id")),f=Object(r.X)(f,e.id,t,g,m,h),Object(s.g)(f)}(c,a,h,b,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,b=i&&l&&l[i],u=b?b.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.hb,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:b,nextOffsetId:u}=c,m=Object(d.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.e)(O,Object(d.c)(l,"id")),O=Object(r.U)(O,e.id,t,h,b,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(j.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(r,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};if(!n)return;if(e.management.progress===l.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.Z)(e,l.f.InProgress),e=Object(r.Y)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(j.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.Z)(e,t?l.f.Complete:l.f.Error),e=Object(r.Y)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.Z)(e,l.f.InProgress),Object(s.g)(e),Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(j.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.Z)(e,a?l.f.Complete:l.f.Error),e=Object(r.Y)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(j.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.o&&console.log(">>> START SYNC");await Object(j.a)("fetchCurrentUser");const t=await async function(){const e=await Object(j.a)("fetchChats",{limit:n.i,withPinned:!0});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,b=[...a||[],...c||[],...l?[l]:[]],u=b.map(e=>Object(o.Db)(t,e)).filter(Boolean),h=b.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!b.includes(O)&&h.push(e),Object(m.lb)(O)){const e=Object(o.Db)(t,O);e&&!b.includes(O)&&u.push(e)}}u.push(...e.users),h.push(...e.chats),t=Object(r.r)(t,Object(d.c)(h,"id")),t=Object(r.q)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.H)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.v)(t,a,i.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.v)(t,a,i.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],c=Object(s.e)();const{chatId:l}=Object(o.y)(c)||{},b=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,i.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(l){const e=await(u=c.chats.byId[l],Object(j.a)("fetchMessages",{chat:u,threadId:i.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.R/2)+1),limit:n.R}));c=Object(s.e)();const{chatId:b}=Object(o.y)(c)||{};if(e&&b===l){const s=c.messages.byChatId[l],n=Object(d.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[l]:{byId:n,threadsById:{[i.MAIN_THREAD_ID]:{...s&&s.threadsById[i.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.K)(c,Object(d.c)(e.chats,"id")),c=Object(r.jb)(c,l,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(b).map(Number).forEach(e=>{c=Object(r.v)(c,e,i.MAIN_THREAD_ID,"draft",b[e])}),e?c=Object(r.w)(c,Object(d.c)(a,"id")):a&&(c=Object(r.mb)(c,Object(d.c)(a,"id")));Object(s.g)(c)}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.o&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.o&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([D(),F()]),await Object(j.a)("fetchCurrentUser"),n.o&&console.log(">>> FINISH AFTER-SYNC")}(t)});const B=Object(g.a)(e=>e(),500,!1,!0);function U(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(m.lb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(m.lb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Db)(e,s);if(!n)return;const{id:c,accessHash:r}=n;B(()=>Object(j.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Db)(e,n);c&&(async()=>{const t=await Object(j.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.mb)(e,Object(d.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(j.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.e)(o,Object(d.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(j.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.e)(Object(s.e)(),Object(d.c)(t.users,"id"));a=Object(r.c)(a,Object(d.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),o=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:o.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(j.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:d}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Db)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.InProgress));await Object(j.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.lb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.Complete))}(n,c,i,d)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Db)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(j.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.bb)||c.value.match(n.cb)?t.openTelegramLink({url:c.value}):window.open(c.value);break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(j.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:r}=n;r?Object(s.d)().showError({error:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(o.r)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(o.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(j.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:d,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.InProgress}}),n&&await Object(j.a)("updateProfilePhoto",n),c||i||d){if(await Object(j.a)("updateProfile",{firstName:c,lastName:i,about:d})){e=Object(s.e)();const a=t&&Object(o.Db)(e,t);a&&Object(s.g)(Object(r.lb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:d}}))}}if(b){await Object(j.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.lb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===l.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:l.j.Idle,isUsernameAvailable:void 0}});const t=await Object(j.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(j.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:l.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(j.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==l.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(j.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.e)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.K)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(j.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(m.lb)(n)){const t=Object(o.Db)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(j.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.o)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(j.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(j.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(j.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationsSettings",()=>{(async()=>{const e=await Object(j.a)("loadNotificationsSettings");e&&Object(s.g)(Object(r.u)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,isShowPreviews:o}=a;(async()=>{await Object(j.a)("updateNotificationSettings",n,{isSilent:c,isShowPreviews:o})&&Object(s.g)(Object(r.ab)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(j.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.u)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(j.a)("fetchLanguages");e&&Object(s.g)(Object(r.u)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(j.a)("fetchPrivacySettings","phoneNumber"),Object(j.a)("fetchPrivacySettings","lastSeen"),Object(j.a)("fetchPrivacySettings","profilePhoto"),Object(j.a)("fetchPrivacySettings","forwards"),Object(j.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=U(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=U(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(j.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.u)(t,{hasPassword:e.hasPassword}),t=Object(r.kb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("checkPassword",n);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("clearPassword",n);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:o,email:i,onSuccess:l}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:o}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(j.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.kb)(e,{error:void 0}));var H=a(54);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.eb)(e);i&&async function(e,t,a){const n=await Object(j.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.C)(Object(s.e)(),c);o?(i=Object(r.eb)(i,o),i=Object(r.A)(i,l.i.Shipping)):i=Object(r.A)(i,l.i.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(j.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.z)(Object(s.e)(),t),n=l.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=l.i.ShippingInfo);a=Object(r.A)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(j.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.B)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(o.hb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(H.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.D)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.A)(o,l.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.eb)(e),l=Object(o.fb)(e),d=Object(o.hb)(e),b=Object(o.wb)(e);i&&d&&async function(e,t,a,n){if(await Object(j.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.g)(Object(s.e)());Object(s.g)(Object(r.h)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.A)(e,a.step||l.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.y)(e,a));a(76);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":Object(o.L)(e,a.id)||t.loadTopChats(),Object(s.g)(Object(r.F)(e,a.id,a.chat));break;case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.G)(e,n,[a.id]),e=Object(r.F)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.q)(e,t,n.filter(e=>e!==a.id))),e=Object(r.F)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.F)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.F)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.F)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const i=Object(o.f)(e,a.chatId);if(!i)return;a.chatId===c?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.F)(e,a.chatId,{unreadCount:i.unreadCount?i.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:i.unreadMentionsCount?i.unreadMentionsCount+1:1}}));break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(o.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.F)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(r.F)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.g?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,r=Object(o.j)(e,t);if(r){const{[r]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===r&&s.length>=n.I){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(r.I)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(d.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?r&&r.includes(t)?r:[...r||[],t]:r?r.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:o,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:o}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&o){const e=l.findIndex(e=>e.userId===o);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(r.F)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}}});function q(e,t,a,s,n=!1){const c=n?Object(o.mb)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(m.v)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(r.cb)(e,t,a,s):Object(r.J)(e,t,a,s)}function G(e,t){const{id:a,chatId:s}=t;e=Object(r.T)(e,s,i.MAIN_THREAD_ID,[a]),Object(o.W)(e,s,i.MAIN_THREAD_ID)&&(e=Object(r.f)(e,s,i.MAIN_THREAD_ID,a));const{threadInfo:n,firstMessageId:c}=Object(o.yb)(e,s,t)||{};return!c&&Object(m.sb)(t)||n&&(e=Object(r.T)(e,s,n.threadId,[a]),Object(o.W)(e,s,n.threadId)&&(e=Object(r.f)(e,s,n.threadId,a),c||(e=Object(r.v)(e,s,n.threadId,"firstMessageId",t.id)),n.lastMessageId||(e=Object(r.v)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id})))),e}function _(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(r.F)(e,t,{lastMessage:a})}function z(e,t){const a=Object(o.m)(e,t),s=Object(o.X)(e,t,i.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function V(e,t,a,n){if(e){t.forEach(t=>{const a=z(n=Object(r.J)(n,e,t,{isDeleting:!0}),e);a&&(n=_(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.yb)(n,e,a)||{};s&&c.push(s.threadId)}),Object(d.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.i)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=z(n=Object(r.J)(n,t,e,{isDeleting:!0}),t);a&&(n=_(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.i)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(d.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=G(e=q(e,n,c,i),i),i.threadInfo&&(e=Object(r.ib)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.yb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),i.isOutgoing||setTimeout(()=>{Object(s.g)(_(Object(s.e)(),n,l))},350)}else Object(s.g)(_(Object(s.e)(),n,l));Object(o.L)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=q(e,t,n,c,!0);const l=Object(o.lb)(e,t)||[];e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",Object(d.o)([...l,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=q(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.ib)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=_(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.mb)(e,t,n))return;e=q(e,t,n,c,!0);const l=Object.keys(Object(o.nb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=G(e,c);const i=Object(o.k)(e,t,n);e=Object(r.i)(e,t,[n]),c.isScheduled&&(e=Object(r.j)(e,t,[n])),e=Object(r.J)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=_(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,l=Object(o.lb)(e,t)||[];e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",[...l,c.id]);const d=Object(o.mb)(e,t,n);e=Object(r.j)(e,t,[n]),e=Object(r.cb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,l=Object(o.gb)(e,t)||[],d=n?[...l,...c]:l.filter(e=>!c.includes(e));Object(s.g)(Object(r.v)(e,t,i.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c}=a,i={...Object(o.zb)(e,t,n),...c};if(!i.threadId)return;e=Object(r.ib)(e,t,n,i),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(m.lb)(n)&&(e=Object(r.i)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;V(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(r.cb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.j)(Object(s.e)(),e,t);const a=Object(o.nb)(n,e);n=Object(r.v)(n,e,i.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a;V(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.J)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(r.J)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(r.J)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(r.J)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});var W=a(105);const $=Object(W.f)((function(){let e=Object(s.e)();Q.forEach(([t,a])=>{e=Object(r.lb)(e,t,{status:a})}),Object(s.g)(e),Q=[]}),3e3,!0);let Q=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.k)(e,a.id);case"updateUser":return Object(r.lb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,Q.push([s,n]),void $();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.lb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.fb)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(r.a)(Object(s.e)(),a.id):Object(r.o)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(r.ab)(e,a.peerType,a.isSilent,a.isShowPreviews)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var K=a(43),J=a(8),Y=a(27),Z=a(125),X=a(42),ee=a(100),te=a(66),ae=a(93),se=a(56),ne=a(32),ce=a(31),re=a(143),oe=a(127);a(185);var ie=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:r,onChange:o,onCheck:i})=>{const l=Object(c.m)(e=>{o&&o(e),i&&i(e.currentTarget.checked)},[o,i]),d=Object(J.a)("Switcher",r&&"disabled");return c.a.createElement("label",{className:d,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:r,onChange:l}),c.a.createElement("span",{className:"widget"}))});a(186);const le=[0,1,2];var de=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:r}=e.chats,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(d.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:u,currentUserId:O,globalSearchChatId:j,searchDate:g,theme:f,animationLevel:p,chatsById:I,openChat:v,openTipsChat:y,setGlobalSearchDate:w,setSettingOption:C})=>{const E=e===l.d.ChatList,M={date:void 0},S={id:void 0},k=Object(c.p)(()=>g?Object(R.a)(new Date(1e3*g)):void 0,[g]),N=Object(c.p)(()=>E&&I?Object.values(I).reduce((e,t)=>Object(m.hb)(t)&&t.unreadCount?e+1:e,0):0,[E,I]),P=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(ce.a,{round:!0,ripple:E&&!h.f,size:"smaller",color:"translucent",className:t?"active":"",onClick:E?e:()=>d(),ariaLabel:E?"Open menu":"Return to chat list"},c.a.createElement("div",{className:Object(J.a)("animated-menu-icon",!E&&"state-back")})),[E,d]),T=Object(c.m)(()=>{b||a("")},[b,a]),A=Object(c.m)(()=>{v({id:O})},[O,v]),x=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light",a="dark"===t;C({theme:t,customBackground:a?n.m:void 0,patternColor:a?n.n:n.s}),Object(te.a)(t,p>0)},[p,C,f]),L=Object(c.m)(e=>{e.stopPropagation();const t=0===p?2:0;le.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),C({animationLevel:t})},[p,C]),F=Object(ae.a)(),D=Boolean(j)||e===l.d.GlobalSearch||e===l.d.Contacts,B=e===l.d.Contacts?F("SearchFriends"):F("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(se.a,{trigger:P,footer:n.f},c.a.createElement(ne.a,{icon:"saved-messages",onClick:A},F("SavedMessages")),c.a.createElement(ne.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},F("ArchivedChats")),N>0&&c.a.createElement("div",{className:"archived-badge"},N)),c.a.createElement(ne.a,{icon:"user",onClick:r},F("Contacts")),c.a.createElement(ne.a,{icon:"settings",onClick:s},F("Settings")),c.a.createElement(ne.a,{icon:"darkmode",onClick:x},c.a.createElement("span",{className:"menu-item-name"},"Dark Mode"),c.a.createElement(ie,{id:"darkmode",label:"Toggle Dark Mode",checked:"dark"===f})),c.a.createElement(ne.a,{icon:"animations",onClick:L},c.a.createElement("span",{className:"menu-item-name capitalize"},F("Appearance.Animations").toLowerCase()),c.a.createElement(ie,{id:"animations",label:"Toggle Animations",checked:p>0})),c.a.createElement(ne.a,{icon:"help",onClick:y},"Telegram Features"),c.a.createElement(ne.a,{icon:"bug",href:n.w},"Report Bug")),c.a.createElement(re.a,{inputId:"telegram-search-input",className:j||g?"with-picker-item":"",value:t||b,focused:D,isLoading:u,placeholder:B,canClose:Boolean(j||g),onChange:a,onReset:d,onFocus:T},k&&c.a.createElement(oe.a,{icon:"calendar",title:k,canClose:!0,isMinimized:Boolean(j),className:"search-date",onClick:w,clickArg:M}),j&&c.a.createElement(oe.a,{chatOrUserId:j,onClick:i,canClose:!0,clickArg:S}))))})),be=a(20);a(187);var ue=Object(s.h)(e=>Object(d.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(ae.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState"},c.a.createElement(be.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),me=a(128),he=a(102),Oe=a(29),je=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(g.g)(e=>e(),e),[e]))(t),r=Object(Oe.a)();return Object(he.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},ge=a(157),fe=a(177);var pe=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n},lastSyncTime:c}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:c}},(e,t)=>Object(d.l)(t,["loadChatFolders"]))(({chatsById:e,usersById:t,chatFoldersById:a,orderedFolderIds:s,lastSyncTime:n,loadChatFolders:r})=>{const o=Object(c.q)(null),[i,l]=Object(c.r)(0);Object(c.n)(()=>{n&&r()},[n,r]);const b=Object(c.p)(()=>s?s.map(e=>a[e]||{}).filter(Boolean):void 0,[a,s]),u=je(()=>{if(!b||!b.length)return;const a=Object.keys(e).map(Number),s=b.map(s=>{const{unreadDialogsCount:n,hasActiveDialogs:c}=Object(m.p)(e,t,s,a)||{};return{id:s.id,badgeCount:n,isBadgeActive:c}});return Object(d.c)(s,"id")},3e3,[b,e,t]),O=Object(c.p)(()=>{if(b&&b.length)return[{title:"All"},...b.map(e=>({title:e.title,...u&&u[e.id]}))]},[b,u]),j=Object(c.m)(e=>{l(e)},[]);Object(c.n)(()=>{O&&O.length&&i>=O.length&&l(0)},[i,O]),Object(c.n)(()=>{if(o.current&&h.k&&O&&O.length)return Object(me.b)(o.current,{onSwipe:(e,t)=>{t===me.a.Left?l(Math.min(i+1,O.length-1)):t===me.a.Right&&l(Math.max(0,i-1))}})},[i,O]);const{shouldRender:g,transitionClassNames:f}=Object(Y.a)(!s,void 0,!0),p=Object(ae.a)();function I(){const e=Object.values(a).find(({title:e})=>e===O[i].title);return e&&0!==i?c.a.createElement(fe.a,{folderType:"folder",folderId:e.id,noChatsText:p("FilterNoChatsToDisplay")}):c.a.createElement(fe.a,{folderType:"all"})}return c.a.createElement("div",{className:"ChatFolders"},O&&O.length?c.a.createElement(ge.a,{tabs:O,activeTab:i,onSwitchTab:j}):g?c.a.createElement("div",{className:Object(J.a)("tabs-placeholder",f)}):void 0,c.a.createElement(ee.a,{ref:o,name:"slide",activeKey:i,renderCount:O?O.length:void 0},I))})),Ie=a(12),ve=a(17),ye=a(16);var we=e=>{const t=Object(ve.a)(Ie.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Ce=e=>{const t=Object(ve.a)(Ie.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)},Ee=a(47);a(199);let Me;var Se=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,r]=Object(c.r)(!1);Object(c.n)(()=>{e||r(!1)},[e]);const o=Object(ae.a)(),i=Object(J.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{Me&&(clearTimeout(Me),Me=void 0)},[]),d=Object(c.m)(()=>{Me&&(clearTimeout(Me),Me=void 0),Me=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(ce.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{r(!n)},ariaLabel:n?"Close":"Create new chat",tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ee.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(ne.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(ne.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(ne.a,{icon:"user",onClick:t},"New Private Chat")))});a(200);const ke=Object.keys(l.d).length/2;let Ne;var Pe=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,onSearchQuery:n,onContentChange:r,onReset:o})=>{const[i,d]=Object(c.r)(h.k),b=Object(c.q)(!1),u=Object(c.m)(()=>{r(l.d.Settings)},[r]),m=Object(c.m)(()=>{r(l.d.Contacts)},[r]),O=Object(c.m)(()=>{r(l.d.NewChannelStep1)},[r]),j=Object(c.m)(()=>{r(l.d.NewGroupStep1)},[r]),g=Object(c.m)(()=>{r(l.d.Archived)},[r]),f=Object(c.m)(()=>{e===l.d.ChatList&&(b.current=!0,d(!0))},[e]),p=Object(c.m)(()=>{b.current=!1,Ne&&(clearTimeout(Ne),Ne=void 0),Ne=window.setTimeout(()=>{b.current||d(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==l.d.ChatList?t=window.setTimeout(()=>{d(!1)},250):(b.current||h.k)&&d(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.k?void 0:f,onMouseLeave:h.k?void 0:p},c.a.createElement(de,{content:e,contactsFilter:s,onSearchQuery:n,onSelectSettings:u,onSelectContacts:m,onSelectArchived:g,onReset:o}),c.a.createElement(ue,null),c.a.createElement(ee.a,{name:"zoom-fade",renderCount:ke,activeKey:e},()=>{switch(e){case l.d.ChatList:return c.a.createElement(pe,null);case l.d.GlobalSearch:return c.a.createElement(we,{searchQuery:t,searchDate:a,onReset:o});case l.d.Contacts:return c.a.createElement(Ce,{filter:s});default:return}}),c.a.createElement(Se,{isShown:i,onNewPrivateChat:m,onNewChannel:O,onNewGroup:j}))});var Te=e=>{const t=Object(ve.a)(Ie.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Ae=e=>{const t=Object(ve.a)(Ie.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Re,xe=e=>{const t=Object(ve.a)(Ie.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};a(201);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(Re||(Re={}));const Le=Object.keys(Re).length/2;var Fe=Object(c.h)(Object(s.h)(e=>{const{query:t,date:a}=e.globalSearch;return{searchQuery:t,searchDate:a}},(e,t)=>Object(d.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,setGlobalSearchQuery:a,setGlobalSearchChatId:s,resetChatCreation:n,setGlobalSearchDate:r,loadPasswordInfo:o,clearTwoFaError:i})=>{const[d,b]=Object(c.r)(l.d.ChatList),[u,m]=Object(c.r)(l.m.Main),[O,j]=Object(c.r)(""),[g,f]=Object(c.r)(0);let p=Re.Main;switch(d){case l.d.Archived:p=Re.Archived;break;case l.d.Settings:p=Re.Settings;break;case l.d.NewChannelStep1:case l.d.NewChannelStep2:p=Re.NewChannel;break;case l.d.NewGroupStep1:case l.d.NewGroupStep2:p=Re.NewGroup}const I=Object(c.m)(e=>{if(d!==l.d.NewGroupStep2||e){if(d===l.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(d===l.d.Settings)switch(u){case l.m.EditProfile:case l.m.Folders:case l.m.General:case l.m.Notifications:case l.m.Privacy:case l.m.Language:return void m(l.m.Main);case l.m.GeneralChatBackground:return void m(l.m.General);case l.m.GeneralChatBackgroundColor:return void m(l.m.GeneralChatBackground);case l.m.PrivacyPhoneNumber:case l.m.PrivacyLastSeen:case l.m.PrivacyProfilePhoto:case l.m.PrivacyForwarding:case l.m.PrivacyGroupChats:case l.m.PrivacyActiveSessions:case l.m.PrivacyBlockedUsers:case l.m.TwoFaDisabled:case l.m.TwoFaEnabled:case l.m.TwoFaCongratulations:return void m(l.m.Privacy);case l.m.PrivacyPhoneNumberAllowedContacts:case l.m.PrivacyPhoneNumberDeniedContacts:return void m(l.m.PrivacyPhoneNumber);case l.m.PrivacyLastSeenAllowedContacts:case l.m.PrivacyLastSeenDeniedContacts:return void m(l.m.PrivacyLastSeen);case l.m.PrivacyProfilePhotoAllowedContacts:case l.m.PrivacyProfilePhotoDeniedContacts:return void m(l.m.PrivacyProfilePhoto);case l.m.PrivacyForwardingAllowedContacts:case l.m.PrivacyForwardingDeniedContacts:return void m(l.m.PrivacyForwarding);case l.m.PrivacyGroupChatsAllowedContacts:case l.m.PrivacyGroupChatsDeniedContacts:return void m(l.m.PrivacyGroupChats);case l.m.TwoFaNewPassword:return void m(l.m.TwoFaDisabled);case l.m.TwoFaNewPasswordConfirm:return void m(l.m.TwoFaNewPassword);case l.m.TwoFaNewPasswordHint:return void m(l.m.TwoFaNewPasswordConfirm);case l.m.TwoFaNewPasswordEmail:return void m(l.m.TwoFaNewPasswordHint);case l.m.TwoFaNewPasswordEmailCode:return void m(l.m.TwoFaNewPasswordEmail);case l.m.TwoFaChangePasswordCurrent:case l.m.TwoFaTurnOff:case l.m.TwoFaRecoveryEmailCurrentPassword:return void m(l.m.TwoFaEnabled);case l.m.TwoFaChangePasswordNew:return void m(l.m.TwoFaChangePasswordCurrent);case l.m.TwoFaChangePasswordConfirm:return void m(l.m.TwoFaChangePasswordNew);case l.m.TwoFaChangePasswordHint:return void m(l.m.TwoFaChangePasswordConfirm);case l.m.TwoFaRecoveryEmail:return void m(l.m.TwoFaRecoveryEmailCurrentPassword);case l.m.TwoFaRecoveryEmailCode:return void m(l.m.TwoFaRecoveryEmail);case l.m.FoldersCreateFolder:case l.m.FoldersEditFolder:return void m(l.m.Folders)}b(l.d.ChatList),j(""),a({query:""}),r({date:void 0}),s({id:void 0}),n(),setTimeout(()=>{f(Date.now())},250)}else b(l.d.NewGroupStep1)},[d,a,s,r,n,u]),v=Object(c.m)(t=>{d!==l.d.Contacts?(b(l.d.GlobalSearch),t!==e&&a({query:t})):j(t)},[d,a,e]);return Object(c.n)(()=>d!==l.d.ChatList?Object(X.a)(()=>I()):void 0,[d,I]),Object(c.n)(()=>{i(),u===l.m.Privacy&&o()},[i,o,u]),c.a.createElement(ee.a,{id:"LeftColumn",name:h.f?"slide-layers":"push-slide",renderCount:Le,activeKey:p},()=>{switch(p){case Re.Archived:return c.a.createElement(xe,{onReset:I});case Re.Settings:return c.a.createElement(Te,{currentScreen:u,onScreenSelect:m,onReset:I});case Re.NewChannel:return c.a.createElement(Ae,{key:g,isChannel:!0,content:d,onContentChange:b,onReset:I});case Re.NewGroup:return c.a.createElement(Ae,{key:g,content:d,onContentChange:b,onReset:I});default:return c.a.createElement(Pe,{content:d,searchQuery:e,searchDate:t,contactsFilter:O,onContentChange:b,onSearchQuery:v,onReset:I})}})})),De=a(124),Be=a(13),Ue=a(49);var He=()=>{const[e,t]=Object(c.r)(Ue.a.get());return Object(c.n)(()=>{const e=Object(g.g)(()=>{t(Ue.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),e},qe=a(37);function Ge(e,t){const a=Object(qe.a)(e,!0),s=Object(c.q)(),n=Object(Oe.a)(),r=null!=e;return r&&s.current&&(clearTimeout(s.current),s.current=void 0),Object(he.a)(()=>{t&&!r&&a&&!s.current&&(s.current=window.setTimeout(()=>{s.current=void 0,n()},t))},[e]),s.current&&t&&!r?a:e}function _e(e,t){const a=e<=n.Z?16:32,s=function(e){if(e>n.W){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.V){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.Z?54:64,r=t?s-a-c:s-a,o=e>n.Z?Math.min(s-a,512):s-a,i=o/r,l=r/o;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:o/258,toolbarForUnpinHiddenScale:258/o}}var ze=a(133),Ve=a(130);function We(e,t=!1,a=!1){const s=Object(qe.a)(e,t);return a||null!=e?e:s}var $e=a(45),Qe=a(96),Ke=a(111);var Je=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0};var Ye=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(m.jb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.O)(e,t),l="thread"===s&&a===i.MAIN_THREAD_ID,d="thread"===s&&a!==i.MAIN_THREAD_ID,b=Object(o.V)(e),u=Boolean(Object(o.K)(e,t)),O=Boolean(l&&n&&(c||Object(m.nb)(n))&&n.isNotJoined),j=l||d,g=l&&!r&&!O,f=!Object(o.R)(e),p=l&&!O;return{noMenu:!(h.f&&O||h.f&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:O,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(d.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:O})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),w=Object(c.m)(()=>{I(void 0)},[]),C=Object(c.m)(()=>{u({chatId:e})},[u,e]),E=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(O(),h.f){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[O]),S=Object(ae.a)();return c.a.createElement("div",{className:"HeaderActions"},!h.f&&r&&c.a.createElement(ce.a,{size:"tiny",ripple:!0,fluid:!0,onClick:C},S(s?"Subscribe":"Join Group")),!h.f&&n&&c.a.createElement(ce.a,{size:"tiny",ripple:!0,fluid:!0,onClick:E},S("Start")),!h.f&&o&&c.a.createElement(ce.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(h.f||!r)&&c.a.createElement(ce.a,{ref:j,className:g?"active":"",round:!0,ripple:!h.f,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(Je,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:C,onSearchClick:M,onClose:y,onCloseAnimationEnd:w}))})),Ze=a(104),Xe=a(35),et=a(97),tt=a(34);function at(e){const t=e&&Object(m.E)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(h.o)()&&t.includes("image/webp"),[r,o]=Object(c.r)(tt.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(tt.c)("b64-"+i,t).then(o).catch(e=>{n.o&&console.error(e)})},[i,s,t]),s?r:t}var st=a(107),nt=a(33),ct=a(36);function rt(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var ot=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),r="clipPath"+e,o=function(e,t,a){let s="";if(3===a)s=rt(0,0,2,t,1)+rt(0,12,2,t+1,1)+rt(0,25,2,t,1);else for(let e=0;e\n \n `}(r,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:o,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:r}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:r,clipPath:o}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${o} `),u&&(u.innerHTML=o),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:r,markHeight:o,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(J.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${r}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${o}px; transform: translateY(${i}px);`})))});var it=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=at(e),d=Object(et.a)(Object(m.D)(e,"pictogram")),b=Object(m.M)(e,Boolean(l)),[u,h,O]=Object(ct.a)(),j=Object(c.m)(()=>{O(),r&&r(e.id)},[O,r,e.id]),g=Object(ae.a)();return c.a.createElement("div",{className:Object(J.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:g("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:g("UnpinMessageAlertTitle"),className:"unpin-button",onClick:h},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(st.a,{isOpen:u,onClose:O,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:j}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o},c.a.createElement(ot,{count:t,index:a}),l&&function(e,t){const{width:a,height:s}=Object(Ze.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(l,d),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title"},s||`${g("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",null,Object(Xe.a)(b))),c.a.createElement(nt.a,null)))}),lt=a(48),dt=a(165);a(204);var bt=Object(s.h)((e,{message:t})=>{const a=Object(o.qb)(e,t);return{senderName:a?Object(m.U)(a):void 0}},(e,t)=>Object(d.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,senderName:s,focusMessage:n,closeAudioPlayer:r})=>{const o=lt.c(Object(m.D)(e,"inline")),{playPause:i,isPlaying:l}=Object(dt.a)(Object(m.A)(e),Object(m.r)(e),o,void 0,void 0,!0),d=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),b=Object(c.m)(()=>{l&&i(),r()},[r,l,i]),u=Object(ae.a)();if(a)return;const O=Object(m.u)(e);return c.a.createElement("div",{className:Object(J.a)("AudioPlayer",t)},c.a.createElement(ce.a,{round:!0,ripple:!h.f,color:"translucent",size:"smaller",className:Object(J.a)("toggle-play",l?"pause":"play"),onClick:i,ariaLabel:l?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:d},O?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title"},Object(Xe.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle"},Object(Xe.a)(a)))}(O):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title"},t&&Object(Xe.a)(t)),c.a.createElement("div",{className:"subtitle"},e))}(u("AttachAudio"),s),c.a.createElement(nt.a,null)),c.a.createElement(ce.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:b,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(205);var ut=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,l=Object(o.f)(e,t),{typingStatus:d}=l||{},{chatId:b,messageId:u}=e.audioPlayer,h=b&&u?Object(o.k)(e,b,u):void 0,O=Object(o.Ab)(e,t,a);let j;if("pinned"===s){const a=Object(o.gb)(e,t);j=a&&a.length}else if("scheduled"===s){const a=Object(o.lb)(e,t);j=a&&a.length}else if("thread"===s&&a!==i.MAIN_THREAD_ID){const s=Object(o.zb)(e,t,a);s&&(j=s.messagesCount)}let g={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),audioMessage:h,chatTitleLength:l&&Object(m.l)(l).length,chatsById:r,originChatId:O?O.id:t,messagesCount:j,isChatWithSelf:Object(o.O)(e,t),isChatWithBot:l&&Object(o.N)(e,l),lastSyncTime:c};const f=Object(o.m)(e,t);if("thread"===s&&f)if(a===i.MAIN_THREAD_ID){const s=Object(o.gb)(e,t);if(s&&s.length){const t=f[s[0]],{canUnpin:n}=t&&Object(o.b)(e,t,a)||{};g={...g,pinnedMessageIds:s,messagesById:f,canUnpin:n}}}else{const s=Object(o.Bb)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.J)(e,n):void 0,r=c?Object(m.U)(c):void 0;g={...g,pinnedMessageIds:s,messagesById:f,canUnpin:!1,topMessageTitle:r}}return g},(e,t)=>Object(d.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageTitle:l,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:O,audioMessage:j,chatTitleLength:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:w,openChatWithInfo:C,pinMessage:E,focusMessage:M,openChat:S,loadPinnedMessages:k,toggleLeftColumn:N,exitMessageSelectMode:P})=>{const[T,A]=Object(c.r)(0),R=Array.isArray(s)?s[T]:s,x=r&&R?r[R]:void 0,L=Array.isArray(s)?s.length:s?1:0;Object(c.n)(()=>{t===i.MAIN_THREAD_ID&&w&&k({chatId:e})},[e,k,w,t]),Object(c.n)(()=>{A(0)},[e]),Object(c.n)(()=>{A(L?Object(ze.a)(L,T):-1)},[L,T]),Object(Ve.a)(e,R,x);const{width:F}=He(),D=F<=n.V,B=F>=n.Z&&u,U=Object(c.q)(null),H=Object(c.q)(!0),q=Object(c.m)(()=>{C({id:e})},[C,e]),G=Object(c.m)(t=>{E({chatId:e,messageId:t,isUnpin:!0})},[E,e]),_=Object(c.m)(()=>{if(x){M({chatId:x.chatId,threadId:t,messageId:x.id});const e=Object(ze.a)(L,T+1);A(e)}},[x,M,t,L,T]),z=Object(c.m)(()=>{S({id:e,threadId:i.MAIN_THREAD_ID,type:"pinned"})},[S,e]),V=Object(c.m)(()=>{if(h.f){const e=document.getElementById(n.u);e&&e.blur()}t!==i.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&P(),S({id:p,threadId:i.MAIN_THREAD_ID})):h.f?S({id:void 0}):N()},[S,p,t,a,N,b,P]),W=Object(c.p)(()=>{if(!D||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(m.hb)(a))return t;const s=a.unreadCount||0;return!s||a.isMuted&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[D,f]),$=F>=n.V&&Fn.Z&&F30),Q=$||F>n.W&&F{const e=U.current;if(e)return Q&&oe?void(O||$?(H.current&&(e.classList.add("tools-stacked","animated"),H.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),H.current=!0)):(e.classList.remove("tools-stacked","animated"),void(H.current=!0))},[Q,oe,$,O]);const ie=Object(ae.a)();function le(){return"thread"===a&&t===i.MAIN_THREAD_ID?c.a.createElement(c.a.Fragment,null,D&&de(B,W),c.a.createElement("div",{className:"chat-info-wrapper",onClick:q},Object(m.lb)(e)?c.a.createElement(Qe.a,{userId:e,typingStatus:d,withFullInfo:y,withMediaViewer:!0,withUpdatingStatus:!0}):c.a.createElement(Ke.a,{chatId:e,typingStatus:d,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,ie("CommentsCount",I))):"pinned"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,ie("PinnedMessagesCount",I))):"scheduled"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,v?ie("Reminders"):ie("messages",I))):void 0}function de(e=!1,t){return c.a.createElement("div",{className:"back-button"},c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",onClick:V,ariaLabel:e?"Close":"Back"},c.a.createElement("div",{className:Object(J.a)("animated-close-icon",!e&&"state-back")})),t&&c.a.createElement("div",{className:"unread-count "+(t.isActive?"active":"")},Object($e.b)(t.totalCount)))}return c.a.createElement("div",{className:"MiddleHeader",ref:U},c.a.createElement(ee.a,{name:"slide-fade",activeKey:"thread"===a?t:1},le),c.a.createElement("div",{className:"header-tools"},te&&ne&&!K&&c.a.createElement(it,{key:e,message:ne,count:L,index:T,customTitle:re,className:se,onUnpinMessage:o?G:void 0,onClick:_,onAllPinnedClick:z}),K&&X&&c.a.createElement(bt,{key:Object(m.A)(X),message:X,className:Z}),c.a.createElement(Ye,{chatId:e,threadId:t,messageListType:a})))})),mt=a(150);function ht(e){return"albumId"in e}function Ot(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(R.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((r,o)=>{r.isInAlbum?a?(a.messages.push(r),r.content.text&&(a.mainMessage=r)):a={albumId:r.groupedId,messages:[r],mainMessage:r}:s.push(r);const i=e[o+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(R.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||r.senderId!==i.senderId||r.isOutgoing!==i.isOutgoing||Object(m.db)(r)||Object(m.db)(i)||r.forwardInfo&&i.forwardInfo&&(r.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||r.inlineButtons||i.inlineButtons)&&(s=[],n.senderGroups.push(s))}}),c}var jt=a(95);function gt(){const[e,t]=Object(ct.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(g.a)(e=>e(),s,n,r),[s,n,r]));var s,n,r;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(g.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(g.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var ft=a(145),pt=a(115);let It=!1;var vt=({containerRef:e,className:t,messageIds:a,containerHeight:s,listItemElementsRef:r,focusingId:o,anchorIdRef:i,anchorTopRef:l,loadMoreForwards:d,loadMoreBackwards:b,isViewportNewest:u,firstUnreadId:m,onFabToggle:h,children:O})=>{const j=Object(c.q)(null),g=Object(c.q)(null),f=Object(c.q)(null),p=Object(c.m)(()=>{if(It)return;if(!a||!a.length)return void h(!1);if(!u)return void h(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t;h(m?!(0===c):!(c<=50))},[a,u,e,h,m]),{observe:I,freeze:v,unfreeze:y}=Object(jt.a)({rootRef:e,margin:n.Q},t=>{if(!d||!b)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(ft.a)(e.current),b()):"forwards-trigger"===s.className&&s.dataset.isActive&&(Object(ft.a)(e.current),d())});Object(jt.c)(j,I),Object(jt.c)(g,I);const{observe:w,freeze:C,unfreeze:E}=Object(jt.a)({rootRef:e,margin:50},([{target:e}])=>{e.dataset.isActive&&p()});return Object(jt.c)(f,w),Object(he.a)(()=>{o?(v(),C()):(E(),y())},[o]),Object(he.a)(()=>{if(!r.current)return;const e=r.current.filter(e=>a.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(i.current=t.id,l.current=t.getBoundingClientRect().top)},[a,s]),Object(he.a)(()=>{It=!0,setTimeout(()=>{It=!1},100)},[a]),Object(c.n)(p,[m]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:j,key:"backwards-trigger",className:"backwards-trigger"}),O,c.a.createElement("div",{ref:g,key:"forwards-trigger",className:"forwards-trigger","data-is-active":!u}),c.a.createElement("div",{ref:f,key:"fab-trigger",className:"fab-trigger","data-is-active":u}))},yt=a(132),wt=a(135);function Ct(e){return"number"==typeof e}function Et(e){return e?175:100}function Mt(e){const t=Object(m.tb)(e),a=Object(m.qb)(e),s=Object(m.G)(e)||Object(m.Q)(e),n=Object(m.O)(e),c=Boolean(Object(m.Q)(e)),{width:r,height:o}=s?Object(Ze.f)(s,t,a,c):Object(Ze.h)(n,t,a),i=Et(Boolean(Object(m.N)(e)));let l=1;re+t,t)}function Rt(e,t,a){return ea?a:e}function xt(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&Nt&&(t.width=e.width+e.x),a&Pt&&(t.height=e.height+e.y)}),t}function Lt(e,t,a,s){const c=a.messages.map(e=>{const t=Mt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.Z?a/100*69-(t?1.625:0)*Ze.c:((e?30:29)-(t?1.625:0))*Ze.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const r=function(e,t){return e.map(e=>t>1.1?Rt(e,1,2.75):Rt(e,.6667,1))}(e,t),o=e.length,i=new Array(o),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=At(r.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==o;++e){const t=o-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==o-1;++e)for(let a=1;a!==o-e;++a){const s=o-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==o-1;++e)for(let t=1;t!==o-e;++t)for(let a=1;a!==o-e-t;++a){const s=o-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==r;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(o-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:Tt|kt|Nt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:Tt|Pt|Nt}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,r=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:r},sides:kt|Tt|Pt},{dimensions:{x:c+s,y:0,width:c,height:r},sides:kt|Nt|Pt}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,r=Math.round(1.5*a),o=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-r),i=s-o-n,l=Math.min(c,Math.round(Math.min(i/t[0],o/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:kt|Tt|Pt},{dimensions:{x:i+n,y:0,width:o,height:l},sides:kt|Nt|Pt}]}(e)}(u):3===i?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,r=t,o=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=r-o-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(o*s[2],i*s[1])))),d=Math.min(Math.round(r*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:kt|Tt|Pt},{dimensions:{x:d+a,y:0,width:l,height:i},sides:kt|Nt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:Pt|Nt}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,r=Math.round(Math.min(c/a[0],.66*(s-n))),o=(t-n)/2,i=Math.min(s-r-n,Math.round(Math.min(o/a[1],o/a[2])));return[{dimensions:{x:0,y:0,width:c,height:r},sides:Tt|kt|Nt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:Pt|Tt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:Pt|Nt}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,r=Math.round(Math.min(c/t[0],.66*(s-a))),o=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),o*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),o*t[3])),d=c-i-l-2*a,b=Math.min(s-r-a,o);return[{dimensions:{x:0,y:0,width:c,height:r},sides:Tt|kt|Nt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:Pt|Tt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:Pt},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:Nt|Pt}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,r=Math.round(Math.min(c*t[0],.6*(a-s))),o=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(o/t[1]),l=Math.round(o/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-r-s,o));return[{dimensions:{x:0,y:0,width:r,height:c},sides:kt|Tt|Pt},{dimensions:{x:r+s,y:0,width:b,height:i},sides:kt|Nt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:Nt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:Pt|Nt}]}(e)}(u),{layout:b,containerStyle:xt(b)}}let Ft;function Dt(e){return Ft||(Ft=document.createElement("span"),Ft.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Ft.style.whiteSpace="nowrap",Ft.style.position="absolute",Ft.style.left="-999px",Ft.style.opacity=".01",document.body.appendChild(Ft)),Ft.innerHTML=e,Ft.offsetWidth}function Bt(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(pt.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var Ut=a(99),Ht=a(178);var qt=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0};var Gt=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.T)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(m.jb)(b)||a===t.chatId)?b:a?Object(o.Db)(e,a):void 0,...s&&{targetUser:Object(o.Db)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,sender:n,targetUser:r,targetMessage:o,targetChatId:i,isFocused:l,focusDirection:d,noFocusHighlight:b})=>{const u=Object(c.q)(null);Object(jt.c)(u,t),Object(Ve.a)(e.chatId,e.replyToMessageId,o),Bt(u,e.chatId,l,d,b),Object(ae.a)();const m=s<=0,[h,O]=Object(ct.a)(m);Object(c.n)(()=>{m||setTimeout(O,10*s)},[s,O,m]);const{transitionClassNames:j}=Object(Y.a)(h,void 0,m,!1),g=Object(Ht.a)(e,n,r,o,i,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:f,contextMenuPosition:p,handleBeforeContextMenu:I,handleContextMenu:v,handleContextMenuClose:y,handleContextMenuHide:w}=Object(yt.a)(u),C=void 0!==p;return a?c.a.createElement("span",{className:"embedded-action-message"},Object(Xe.a)(g)):c.a.createElement("div",{ref:u,id:"message"+e.id,className:Object(J.a)("ActionMessage message-list-item",l&&!b&&"focused",C&&"has-menu-open",j),"data-message-id":e.id,onMouseDown:I,onContextMenu:v},c.a.createElement("span",null,g),p&&c.a.createElement(qt,{isOpen:f,anchor:p,message:e,messageListType:"thread",onClose:y,onCloseAnimationEnd:w}))}));a(206);var _t=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(jt.b)(i,r),d=Object(et.a)(t&&Object(m.D)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=at(t);Object(ae.a)();const h=a&&Object(m.U)(a);return c.a.createElement("div",{ref:i,className:Object(J.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a){const{width:s,height:n}=Object(Ze.k)();return c.a.createElement("img",{id:e,src:a||t,width:s,height:n,alt:""})}(b,u,d),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"message-title"},Object(Xe.a)(h||s||" ")),c.a.createElement("p",null,t?Object(m.db)(t)?c.a.createElement(Gt,{message:t,isEmbedded:!0}):Object(Xe.a)(Object(m.M)(t,Boolean(u))):n||" ")))},zt=a(151),Vt=a(156),Wt=a(162);a(210);var $t=({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(ae.a)();return c.a.createElement("span",{className:"MessageMeta",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object($e.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(Xe.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(R.h)(1e3*e.date)),t&&c.a.createElement(Wt.a,{status:t}))},Qt=a(103),Kt=a(106),Jt=a(152);a(211);var Yt=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(ct.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:h}=b,O=h===n.O,j=Object(jt.b)(o,t),g=Object(jt.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(m.D)(e,"inline"),p=at(e),I=Object(et.a)(f,!j,Object(m.C)(e,"inline",!0),r),v=Boolean(I),[y,w]=Object(ct.a)(v),C=u?y:v,{shouldRenderFullMedia:E,transitionClassNames:M}=Object(Qt.a)(C,"slow"),{width:S,height:k}=Object(Ze.l)(b),N=Object(J.a)("thumbnail",!p&&"empty"),P=Object(J.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!C&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&E&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(J.a)("full-media",M)}),u&&v&&c.a.createElement(Kt.a,{key:f,className:Object(J.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:w}),c.a.createElement(Jt.a,{isOpen:i,fromSticker:b,onClose:d}))},Zt=a(119),Xt=a(112),ea=a(136);function ta(e,t){return Object(ea.a)(Object(m.E)(e),Boolean(t),h.f?n.G:void 0)}var aa=async(e,t,a,s)=>s?"rgba(255,255,255,1)":async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,r=a.height-1;return`rgba(${Array.from(n.getImageData(c,r,1,1).data).join(",")})`}(e,t);var sa=a(113);var na=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,shouldAffectAppendix:d,onClick:b,onCancelUpload:u})=>{const h=Object(c.q)(null),O=(Object(m.G)(t)||Object(m.Q)(t)).blobUrl,j=Object(jt.b)(h,a),[g,f]=Object(c.r)(s),p=g&&j,{mediaData:I,downloadProgress:v}=Object(Xt.a)(Object(m.D)(t,i),!p),y=O||I,w=ta(t,y),{isUploading:C,isTransferring:E,transferProgress:M}=Object(m.s)(t,o||v,p&&!y),S=!1===Object(qe.a)(g),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(E,void 0,S,"slow"),{shouldRenderThumb:P,shouldRenderFullMedia:T,transitionClassNames:A}=Object(Qt.a)(y,"slow"),R=Object(c.m)(()=>{C?u&&u(t):y?b&&b(t.id):f(e=>!e)},[y,C,t,u,b]),x=Object(m.tb)(t);Object(c.o)(()=>{if(!d)return;const e=h.current.closest(".message-content");y?aa(y,x,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[y,x,d,n,r]);const{width:L,height:F,isSmall:D}=l||Mt(t),B=Object(J.a)("media-inner",!C&&"interactive",D&&"small-image",L===F&&"square-image"),U=Object(J.a)("thumbnail",!w&&"empty"),H=l?`width: ${L}px; height: ${F}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:h,className:B,style:H,onClick:C?void 0:R},P&&c.a.createElement("img",{src:w,className:U,width:L,height:F,alt:""}),T&&c.a.createElement("img",{src:y,className:"full-media "+A,width:L,height:F,alt:""}),k&&c.a.createElement("div",{className:"media-loading "+N},c.a.createElement(sa.a,{progress:M,onClick:C?R:void 0})),!y&&!g&&c.a.createElement("i",{className:"icon-download"}),E&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*M),"%"))},ca=a(121),ra=a(134);function oa(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(ra.a)(e.current)},[e]);Object(K.a)(s,n)}var ia=a(137);function la(){return(la=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),h=t.content.video,O=h.blobUrl,j=Boolean(O)||Object(m.b)(h),g=Object(jt.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),w=Object(et.a)(Object(m.D)(t,"pictogram"),!(g&&o),Object(m.C)(t,"pictogram"),o),C=ta(t,w),{mediaData:E,downloadProgress:M}=Object(Xt.a)(Object(m.D)(t,"inline"),!I,Object(m.C)(t,"inline"),o),S=w||C,k=O||E,N=Boolean(j&&g&&k),{isBuffered:P,bufferingHandlers:T}=Object(ca.a)(!s),{isUploading:A,isTransferring:x,transferProgress:L}=Object(m.s)(t,r||M,I&&j&&!P),F=!1===Object(qe.a)(f),{shouldRender:D,transitionClassNames:B}=Object(Y.a)(x,void 0,F),{shouldRenderThumb:U,transitionClassNames:H}=Object(Qt.a)(k,"slow"),[q,G]=Object(c.r)(0),_=Object(c.m)(e=>{G(Math.max(0,e.currentTarget.currentTime-1))},[]),z=Object(m.tb)(t),V=Object(m.qb)(t),{width:W,height:$}=i||Object(Ze.h)(h,z,V);oa(u,N),Object(ia.a)(u,[N]);const Q=Object(c.m)(()=>{A?d&&d(t):j&&!k?p(e=>!e):j&&k&&!v?(y(!0),u.current.play()):l&&l(t.id)},[A,j,k,v,l,d,t]),K=Object(J.a)("media-inner dark",!A&&"interactive"),Z=Object(J.a)("thumbnail",!S&&"empty"),X=Object(J.a)("full-media",H),ee=S?`background-image: url(${S}); background-size: cover`:"",te=i?`width: ${W}px; height: ${$}px; left: ${i.x}px; top: ${i.y}px;`:"",ae=N,se=!j&&E,ne=!j||f&&!v&&!D,ce=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:K,style:te,onClick:A?void 0:Q},(U||!N)&&c.a.createElement("img",{src:S,className:Z,width:W,height:$,alt:""}),ae&&c.a.createElement("video",la({ref:u,className:X,width:W,height:$,autoPlay:v,muted:!0,loop:!0,playsInline:!0,style:ee},T,{onTimeUpdate:_}),c.a.createElement("source",{src:k})),se&&c.a.createElement("img",{src:E,className:"full-media "+H,width:W,height:$,alt:""}),ne&&c.a.createElement("i",{className:"icon-large-play"}),D&&c.a.createElement("div",{className:"media-loading "+B},c.a.createElement(sa.a,{progress:L,onClick:A?Q:void 0})),ce&&c.a.createElement("i",{className:"icon-download"}),x&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*L),"%"):x&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},h.isGif?"GIF":Object(R.e)(h.duration-q)))},ba=a(19);a(213);var ua=Object(s.h)((e,{contact:t})=>({user:Object(o.Db)(e,t.userId)}),(e,t)=>Object(d.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:r,userId:o}=e,i=Object(c.m)(()=>{a({id:o})},[a,o]);return c.a.createElement("div",{className:Object(J.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(Ut.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(ba.c)(r))))}),ma=a(40);var ha=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:r,onChange:o})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),o(s)},[o,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(ma.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:r?-1!==r.indexOf(e.value):void 0,onChange:d})))}),Oa=a(117),ja=a(170);a(216);function ga(e,t){return t>0?(e/t*100).toFixed():0}var fa=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:r})=>{const o=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||o&&o.isChosen,d=o?ga(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?ga(o.votersCount,s||0):0,O=b{r&&u(d)},[r,d]),Object(c.n)(()=>{const e=m.current;if(e&&r){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,r]),!t||!o)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(J.a)("poll-option-chosen",!i&&"wrong",r&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text"},Object(Xe.a)(e.text)),c.a.createElement("div",{className:Object(J.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(217);var pa=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(d.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:w,totalVoters:C}=b,E=w&&w.some(e=>e.isChosen),M=!d.closed&&!E,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=w?Math.max(...w.map(e=>e.votersCount)):C,P=w?w.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(R.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(R.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||E&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,E,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),x=Object(c.m)(e=>{O([e]),m(!0),p(!0),r([e])},[r]),L=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&E&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[E,f,b.results,d.quiz,t.results.solution]);const H=Object(ae.a)();return c.a.createElement("div",{className:"Poll"},j&&t.results.solution&&c.a.createElement(ja.a,{message:Object(wt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U}),c.a.createElement("div",{className:"poll-question"},Object(Xe.a)(d.question)),c.a.createElement("div",{className:"poll-type"},function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"Quiz":"Anonymous Quiz";if(e.closed)return"Final results";return e.isPublic?"Poll":"Anonymous Poll"}(d),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(Ut.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(ce.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(ha,{options:T,onChange:L,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(Oa.a,{name:"poll-"+i,options:T,onChange:x,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(fa,{key:e.option,shouldAnimate:f,answer:e,voteResults:w,totalVoters:C,maxVotersCount:N,correctResults:P})}))),!S&&!k&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t){if(!t)return e?"No answers yet":"No voters yet";return e?t+" answered":t+" voted"}(d.quiz,b.totalVoters)),k&&c.a.createElement(ce.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(ce.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ia=a(146),va=a(51);a(218);var ya=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(m.P)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=Mt(e);i=t===a}const l=Object(c.m)(()=>{o&&(i||o.hasDocument)?window.open(o.url):n&&n()},[o,i,n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:h,description:O,photo:j}=o,g=Object(Ia.a)(O,170),f=["WebPage",j?i&&"with-square-photo":!s&&"without-photo"].filter(Boolean).join(" ");return c.a.createElement("div",{className:f,"data-initial":(d||u)[0]},j&&c.a.createElement(na,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",onClick:l,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(va.a,{className:"site-name",url:b,text:d||u}),h&&c.a.createElement("p",{className:"site-title"},Object(Xe.a)(h)),g&&c.a.createElement("p",{className:"site-description"},Object(Xe.a)(g,["emoji","br"]))))});a(219);var wa=Object(c.h)(({message:e})=>{const t=Object(m.z)(e),{title:a,text:s,description:n,photoUrl:r}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(Xe.a)(a)),s&&c.a.createElement("p",null,Object(Xe.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(r?"has-image":"")},r&&c.a.createElement("img",{className:"invoice-image",src:r,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(Xe.a)(n,["emoji","br"]))))});function Ca(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.R)(e),isSelected:Object(o.U)(e,a.id)}},(e,t)=>Object(d.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:r,dimensions:o}=t,i=Object(c.m)(e=>{e.stopPropagation(),r({messageId:n.id,withShift:e&&e.shiftKey})},[r,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(J.a)("album-item-select-wrapper",s&&"is-selected"),style:o?`left: ${o.x}px; top: ${o.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(220);const Ea=Ca(na),Ma=Ca(da);var Sa=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(d.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,h=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,b){const{photo:O,video:j}=Object(m.v)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&Tt&&I&Pt));return c.a.createElement(Ea,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:h})}if(j)return c.a.createElement(Ma,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:h})})))});a(221);function ka(){return(ka=Object.assign||function(e){for(var t=1;t{const r=Object(c.q)(null),o=Object(c.q)(null),i=Object(c.q)(null),l=e.content.video,d=Object(jt.b)(r,t),[b,u]=Object(c.r)(a&&s),h=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(Xt.a)(Object(m.D)(e,"inline"),!h,Object(m.C)(e,"inline"),n),g=ta(e,O),{isBuffered:f,bufferingHandlers:p}=Object(ca.a)(),I=b&&!f,v=!1===Object(qe.a)(b),{shouldRender:y,transitionClassNames:w}=Object(Y.a)(I||!f,void 0,v),{shouldRenderThumb:C,transitionClassNames:E}=Object(Qt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(ra.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(x=T,()=>{Na&&Na(),Na=x});var x;Object(c.n)(()=>{i.current&&(P?Object(ra.a)(i.current):i.current.pause())},[P]),oa(i,P),Object(ia.a)(i,[O]);const L=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(ra.a)(e):e.pause():(e.currentTime=0,S(!0),A())},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(J.a)("full-media",E);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:L},C&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("img",{src:g,className:"thumbnail",width:Ze.d,height:Ze.d,alt:""})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",ka({ref:i,className:D,width:Ze.d,height:Ze.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,poster:g,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+w},c.a.createElement(sa.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(R.e)(i.current.currentTime):Object(R.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(222);var Ta=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(ce.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text)))));a(223);var Aa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.zb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(d.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const{threadId:r,chatId:o,messagesCount:i,lastMessageId:l,lastReadInboxMessageId:d,recentReplierIds:b}=t,u=Object(c.m)(()=>{n({id:o,threadId:r})},[n,o,r]);if(void 0===i)return;const h=b&&b.map(e=>Object(m.lb)(e)?a[e]:s[e]).filter(Boolean);const O=Boolean(d&&l&&d0&&c.a.createElement("div",{className:"recent-repliers"},h.map(e=>c.a.createElement(Ut.a,{key:e.id,size:"small",user:Object(m.lb)(e.id)?e:void 0,chat:Object(m.lb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label"},function(e){if(0===e)return"Leave a Comment";if(1===e)return"1 Comment";return Object($e.a)(e)+" Comments"}(i)),c.a.createElement("i",{className:"icon-next"}))}));a(224);function Ra(e){const t=La(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function xa(e){const t=La(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function La(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Fa=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,h),p=Object(o.O)(e,h),I=f&&Object(m.jb)(f),v=!p&&Object(m.eb)(c),y=i||l||v?Object(o.qb)(e,c):void 0,w=Object(o.J)(e,c),C=O?Object(o.Db)(e,O):void 0,E=d?Object(o.Bb)(e,h,d):void 0,M=c.id===E,S=j===E,k=j&&!S?Object(o.k)(e,h,j):void 0,N=k&&Object(o.qb)(e,k),P=Object(o.Cb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.T)(e,t)):Object(o.T)(e,c)),{direction:A,noHighlight:R}=T&&a||{},x=s.messageIds&&s.messageIds.includes(u),{query:L}=Object(o.A)(e)||{},F=Object(m.K)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.U)(e,t)):Object(o.U)(e,u),{forceSenderName:v,sender:y,originSender:w,botSender:C,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.cb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:R},isForwarding:x,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:L,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.R)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.P)(e,h,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.rb)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.sb)(e,c),shouldLoopStickers:Object(o.tb)(e)}},(e,t)=>Object(d.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:d,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:h,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:w,replyMessage:C,replyMessageSender:E,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:R,lastSyncTime:x,highlight:L,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:q,isPinnedList:G,shouldAutoLoadMedia:_,shouldAutoPlayMedia:z,shouldLoopStickers:V,focusMessage:W,openMediaViewer:$,openAudioPlayer:Q,openUserInfo:K,openChat:Z,cancelSendingMessage:X,markMessagesRead:ee,sendPollVote:te,toggleMessageSelection:se,setReplyingToId:ne,openForwardMenu:re,clickInlineButton:oe})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),de=Object(c.q)(null);Object(jt.c)(le,t);const{width:be}=He(),{isContextMenuOpen:ue,contextMenuPosition:me,handleBeforeContextMenu:he,handleContextMenu:Oe,handleContextMenuClose:je,handleContextMenuHide:ge}=Object(yt.a)(ie),fe=b<=0,[pe,Ie]=Object(ct.a)(fe);Object(c.n)(()=>{fe||setTimeout(Ie,10*b)},[b,Ie,fe]);const{transitionClassNames:ve}=Object(Y.a)(pe,void 0,fe,!1),{chatId:ye,id:we,threadInfo:Ce}=e,Ee=Object(m.tb)(e),Me="scheduled"===q||e.isScheduled,Se=Object(m.ub)(e)&&!w,ke=Boolean(Ce)&&"thread"===q,{forwardInfo:Ne,viaBotId:Pe}=e,Te=Ne&&!A&&!Ne.isLinkedChannelPost,Ae=!!e.groupedId&&!e.isInAlbum,Re=Boolean(n)&&n.messages.length>1,{text:xe,photo:Le,video:Fe,audio:De,voice:Be,document:Ue,sticker:qe,contact:Ge,poll:_e,webPage:ze,invoice:We}=Object(m.v)(e),$e=Object(m.x)(e),Qe=Object(wt.a)(e,L,Ct($e)),Ke=void 0!==me,Je=Object(J.a)("Message message-list-item",u&&"first-in-group",h&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",Ee&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Se&&"has-reply",Ke&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",Re&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ve),Ye=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:h,poll:O,webPage:j,contact:g}=Object(m.v)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return Ct(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):h?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Se,customShape:$e,isLastInGroup:h,asForwarded:Te,hasThread:ke,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),et=!Ne||!A&&p?p:I,tt=Ne?I:p,at=R&&e.adminTitle||Ne&&!Te&&Ne.adminTitle||void 0;Object(Ve.a)(ye,Se?e.replyToMessageId:void 0,C,e.id),Bt(ie,ye,k,N,P),Object(c.o)(()=>{de.current&&(de.current.innerHTML=Ee?'':'')},[Ee]);const st=Object(c.m)(t=>{t.stopPropagation(),se({messageId:we,groupedId:e.groupedId})},[we,e.groupedId,se]),nt=Object(c.m)(e=>{const t=Re&&n&&n.messages?{messageId:we,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:we,withShift:e&&e.shiftKey};se(t)},[se,we,Re,n]),rt=Object(c.m)(()=>{ne({messageId:we})},[ne,we]),ot=Object(c.m)(e=>{e.stopPropagation()},[]),it=Object(c.m)(()=>{et&&(Object(m.lb)(et.id)?K({id:et.id}):Z({id:et.id}))},[et,K,Z]),lt=Object(c.m)(()=>{tt&&(Object(m.lb)(tt.id)?K({id:tt.id}):Z({id:tt.id}))},[tt,K,Z]),dt=Object(c.m)(()=>{v&&K({id:v.id})},[v,K]),bt=Object(c.m)(()=>{W({chatId:ye,threadId:H,messageId:e.replyToMessageId})},[W,ye,H,e.replyToMessageId]),ut=Object(c.m)(()=>{$({chatId:ye,threadId:H,messageId:we,origin:Me?l.h.ScheduledInline:l.h.Inline})},[ye,H,we,$,Me]),mt=Object(c.m)(()=>{Q({chatId:ye,messageId:we})},[ye,we,Q]),ht=Object(c.m)(e=>{$({chatId:ye,threadId:H,messageId:e,origin:Me?l.h.ScheduledAlbum:l.h.Album})},[ye,H,$,Me]),Ot=Object(c.m)(()=>{ee({messageIds:[we]})},[we,ee]),gt=Object(c.m)(()=>{X({chatId:ye,messageId:we})},[X,ye,we]),ft=Object(c.m)(e=>{te({chatId:ye,messageId:we,options:e})},[ye,we,te]),pt=Object(c.m)(()=>{re({fromChatId:ye,groupedId:e.groupedId})},[re,ye,e.groupedId]),It=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);re({fromChatId:ye,messageIds:e})}else re({fromChatId:ye,messageIds:[we]})},[n,re,ye,we]),vt=Object(c.m)(()=>{W({chatId:ye,threadId:i.MAIN_THREAD_ID,messageId:we})},[W,ye,we]),St=Object(c.m)(()=>{W(Ae?{chatId:Ne.fromChatId,groupedId:e.groupedId,groupedChatId:ye}:{chatId:Ne.fromChatId,messageId:Ne.fromMessageId})},[W,Ne,e,ye,Ae]),kt=Object(ae.a)();let Nt,Pt="";const Tt=Object(c.p)(()=>Re?Lt(Ee,Boolean(Te),n,be):void 0,[Re,be,Ee,Te,n]),At=Te?28:0;if(Re||!Le&&!Fe)Tt&&(Nt=Math.max(Et(Boolean(xe)),Tt.containerStyle.width));else{let t;Le?t=Mt(e).width:Fe&&(t=Fe.isRound?Ze.d:Mt(e).width),t&&(Nt=Math.max(Et(Boolean(xe)),t))}Nt&&(Pt=`width: ${Nt+At}px`);const Rt=Object(c.p)(()=>at?Dt(at):void 0,[at]),xt=!(Ke||D||T)&&(!Ae||j),Ft=xt&&R&&!Me,Ht=xt&&(Ne&&(Ne.isChannelPost||A&&!Ee)&&Ne.fromMessageId||G),Gt=e.threadInfo&&(!Ae||j)&&"thread"===q&&!d;return c.a.createElement("div",{ref:ie,id:"message"+we,className:Je,style:Rt?`--meta-safe-author-width: ${Rt}px`:void 0,"data-message-id":we,onClick:D?nt:void 0,onDoubleClick:D?void 0:rt,onMouseDown:D?void 0:he,onContextMenu:D?void 0:Oe,onMouseEnter:Ae&&!j?Ra:void 0,onMouseLeave:Ae&&!j?xa:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":we,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(J.a)("message-select-control group-select",U&&"is-selected"),onClick:st},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=et&&Object(m.lb)(et.id),t=et&&e?et:void 0,a=et&&!e?et:void 0,s=!et&&Ne?Ne.hiddenUserName:void 0;return c.a.createElement(Ut.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:x,onClick:t||a?it:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&Ae?nt:void 0},c.a.createElement("div",{className:Ye,style:Pt},Ye.includes("has-appendix")&&c.a.createElement("div",{className:"svg-appendix",ref:de}),Te&&!$e&&(!Ae||O)&&c.a.createElement("div",{className:"message-title"},kt("ForwardedMessage")),function(){const t=Object(J.a)("content-inner",Te&&!$e&&"forwarded-message",Se&&"reply-message"),r=h&&!Qe&&!Te&&!ke;return c.a.createElement("div",{className:t,onDoubleClick:ot},function(){if($e||!(o&&!Le&&!Fe||Te||Pe||f)||Ae&&!O)return;let t,a;tt?(t=Object(m.U)(tt),Te||(a="color-"+Object(m.X)(tt))):Ne&&Ne.hiddenUserName&&(t=Ne.hiddenUserName);return c.a.createElement("div",{className:"message-title"},t?c.a.createElement("span",{className:Object(J.a)(tt&&"interactive",a),onClick:tt?lt:void 0},Object(Xe.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},kt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:dt},Object(Xe.a)("@"+v.username))),Ne&&Ne.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title"},kt("DiscussChannel")):e.adminTitle&&!R?c.a.createElement("span",{className:"admin-title"},e.adminTitle):void 0)}(),Se&&c.a.createElement(_t,{message:C,sender:E,observeIntersection:a,onClick:bt}),qe&&c.a.createElement(Yt,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:V,lastSyncTime:x}),F&&c.a.createElement(Zt.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:x}),Re&&c.a.createElement(Sa,{album:n,albumLayout:Tt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,isOwn:Ee,hasCustomAppendix:r,lastSyncTime:x,onMediaClick:ht}),!Re&&Le&&c.a.createElement(na,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ut,onCancelUpload:gt}),!Re&&Fe&&Fe.isRound&&c.a.createElement(Pa,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,lastSyncTime:x}),!Re&&Fe&&!Fe.isRound&&c.a.createElement(da,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,uploadProgress:S,lastSyncTime:x,onClick:ut,onCancelUpload:gt}),(De||Be)&&c.a.createElement(Vt.a,{message:e,uploadProgress:S,lastSyncTime:x,isSelectable:Ae,isSelected:B,onPlay:mt,onReadMedia:!Be||Ee&&!A?void 0:Ot,onCancelUpload:gt}),Ue&&c.a.createElement(zt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:Ae,isSelected:B,onCancelUpload:gt}),Ge&&c.a.createElement(ua,{contact:Ge}),_e&&c.a.createElement(pa,{message:e,poll:_e,onSendVote:ft}),!F&&Qe&&c.a.createElement("p",{className:"text-content"},Qe),ze&&c.a.createElement(ya,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ut,onCancelMediaTransfer:gt}),We&&c.a.createElement(wa,{message:e}))}(),(!Ae||j)&&c.a.createElement($t,{message:e,outgoingStatus:M,signature:at,onClick:nt}),Ft?c.a.createElement(ce.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Forward message",onClick:j?pt:It},c.a.createElement("i",{className:"icon-share-filled"})):Ht?c.a.createElement(ce.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:G?vt:St},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,Gt&&c.a.createElement(Aa,{message:e,disabled:d})),e.inlineButtons&&c.a.createElement(Ta,{message:e,onClick:oe})),me&&c.a.createElement(qt,{isOpen:ue,anchor:me,message:e,album:n,messageListType:q,onClose:je,onCloseAnimationEnd:ge}))}));a(225);const Da=h.b?1e3:350,Ba=h.f?300:500,Ua=Object(g.a)(e=>e(),200,!1),Ha=Object(g.j)(e=>e());var qa=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.nb)(e,t):Object(o.m)(e,t),l=Object(o.Bb)(e,t,a);if(a!==i.MAIN_THREAD_ID&&!(r&&l&&r[l]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,h=Object(o.H)(e,t),O=a===i.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&u&&!u.groupedId;let j;if(Object(o.K)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(m.jb)(n),canPost:Object(m.e)(n,a),isChatWithSelf:Object(o.O)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.G)(e,t,a),isViewportNewest:"thread"!==s||Object(o.W)(e,t,a),threadFirstMessageId:Object(o.F)(e,t,a),focusingId:h,isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:l,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(d.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,isChatLoaded:b,isChannelChat:u,canPost:O,bottomOffset:j,isChatWithSelf:f,messageIds:p,messagesById:I,firstUnreadId:v,isViewportNewest:y,threadFirstMessageId:w,isRestricted:C,restrictionReason:E,focusingId:M,isSelectModeActive:S,animationLevel:k,loadViewportMessages:N,markMessageListRead:P,markMessagesRead:T,setScrollOffset:A,lastMessage:x,botDescription:L,threadTopMessageId:F,hasLinkedChat:D})=>{const B=Object(c.q)(null),U=Object(c.q)("thread"===a&&Object(o.ob)(Object(s.e)(),e,t)||0),H=Object(c.q)(),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(v),z=Object(c.q)(),V=Object(c.q)(),W=Object(c.q)(!1),$=Object(c.q)(!p),[Q,Y]=Object(c.r)(),[Z,X]=Object(c.r)(Boolean(M)),ee=Boolean(p);Object(he.a)(()=>{ee&&Object(g.d)(()=>{$.current=!1})},[ee]),Object(he.a)(()=>{z.current=v},[v]);const{observe:te,freeze:se,unfreeze:ne}=Object(jt.a)({rootRef:B,throttleMs:Da,margin:Ba}),{observe:ce,freeze:re,unfreeze:oe}=Object(jt.a)({rootRef:B},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),z.current&&t>=z.current&&P({maxId:t}),s.length&&T({messageIds:s})});Object(he.a)(()=>{V.current=M,M?(se(),re()):(oe(),ne())},[M]);const{observe:ie}=Object(jt.a)({rootRef:B,throttleMs:Da});Object(c.n)(()=>{M?X(!0):setTimeout(()=>{X(!1)},200)},[M]);const le=Object(c.p)(()=>{if(!p||!I)return;const e=!F||p[0]&&w!==p[0]?p:[F,...p];if(!e.length)return;const t=e.map(e=>I[e]);return Ot(Object(d.k)(t,["date","id"]),_.current)},[p,I,w,F]),[de,be,ue]=Object(c.p)(()=>"thread"===a?[Object(g.a)(()=>N({direction:l.e.Backwards}),1e3,!0,!1),Object(g.a)(()=>N({direction:l.e.Forwards}),1e3,!0,!1),Object(g.a)(()=>N({direction:l.e.Around}),1e3,!0,!1)]:[],[N,p]),{isScrolled:me,updateStickyDates:Oe}=gt(),je=Object(c.m)(()=>{if(W.current)return void(W.current=!1);const s=B.current;V.current||Oe(s,r),Ua(()=>{Object(g.b)(()=>{s.parentElement&&(U.current=s.scrollHeight-s.scrollTop,"thread"===a&&A({chatId:e,threadId:t,scrollOffset:U.current}))})})},[Oe,r,a,A,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Y(e.contentRect.height)});return e.observe(B.current),()=>{e.disconnect()}},[]),Object(c.o)(()=>{h.d&&Ha(()=>{if(!B.current.querySelector(".AnimatedSticker.is-playing"))return;const e=B.current.style;e.webkitOverflowScrolling="auto"===e.webkitOverflowScrolling?"":"auto"})}),Object(c.n)(()=>{if(!ue||!b||C||M)return;const e=B.current;(!p||p.length{const s=B.current;if(G.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=y&&p&&p.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=U.current,b=G.current[G.current.length-1],u=b?b.offsetHeight:0,m=y&&t&&d-(a||l)-u<=100;let h;const O=p&&e&&p[0]!==e[0],j=p&&e&&p[p.length-1]!==e[e.length-1];if(m&&j&&!O&&(b&&Object(g.b)(()=>{Object(pt.a)(s,b,"end",20)}),h=i-l,U.current=Math.max(i-h,l),!c))return;const f=void 0!==a&&a!==Q,I=H.current&&s.querySelector("#"+H.current),v=!I&&_.current&&s.querySelector(".unread-divider");if(m&&f)h=i-l;else if(I){h=o+(I.getBoundingClientRect().top-(q.current||0))}else h=v?v.offsetTop-(r?60:10):i-d;Object(ft.a)(s,h),V.current||(W.current=!0,Object(g.b)(()=>{W.current=!1})),U.current=Math.max(i-h,l)},[p,y,Q,r]),Object(c.n)(()=>{(!k||k>0)&&Object(K.b)(200+n.c)},[k,S]);const ge=Object(ae.a)(),fe=Boolean(e&&Object(m.lb)(e)),pe=Boolean(!fe&&!u||f),Ie=Object(J.a)("MessageList custom-scroll",!pe&&"no-avatars",u&&"no-avatars",(!O||"none"!==j)&&"bottom-padding","none"!==j&&"bottom-padding-"+j,S&&"select-mode-active",Z&&"has-focusing",me&&"scrolled");return c.a.createElement("div",{ref:B,className:Ie,onScroll:je},C?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(u?"channel":"chat"))):L?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(Xe.a)(ge(L),["br","emoji","links"]))):p&&!le?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,ge("NoMessages"))):p&&le||x?c.a.createElement(vt,{containerRef:B,className:"messages-container",messageIds:p||[x.id],containerHeight:Q,listItemElementsRef:G,focusingId:M,anchorIdRef:H,anchorTopRef:q,loadMoreForwards:be,loadMoreBackwards:de,isViewportNewest:y,firstUnreadId:v,onFabToggle:i},function(e,t,a,s,r,o,i,l,b,u,h,O,j,g=!1,f=!1){const p=c.a.createElement("div",{className:Object(J.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),I=f?0:t.reduce((e,t)=>e+Object(d.h)(t.senderGroups).length,0);let v=0;const y=t.map((t,f,y)=>{const w=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!ht(t[0])&&Object(m.db)(t[0])){const e=t[0];return Object(d.e)([e.id===l.current&&p,c.a.createElement(Gt,{key:e.id,message:e,observeIntersection:a,appearanceOrder:I-++v})])}let w;return Object(d.h)(t.map((C,E)=>{const M=ht(C)?C.mainMessage:C,S=ht(C)?C:void 0,k=Object(m.tb)(M),N=ht(C),P=t[E+1];M.previousLocalId&&i.current==="message"+M.previousLocalId&&(i.current="message"+M.id);const T=!N&&M.groupedId?M.groupedId:void 0,A=P&&!ht(P)?P.groupedId:void 0,R={isFirstInGroup:0===E,isLastInGroup:E===t.length-1,isFirstInDocumentGroup:Boolean(T&&T!==w),isLastInDocumentGroup:Boolean(T&&T!==A),isLastInList:E===t.length-1&&n===g.length-1&&f===y.length-1};w=T;const x=M.id===l.current&&l.current!==O||M.id===h&&l.current===O,L=Object(m.F)(M),F="scheduled"!==u?L:`${M.date}_${L}`;return Object(d.e)([x&&p,c.a.createElement(Fa,{key:F,message:M,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:S,withAvatar:R.isLastInGroup&&o&&!k&&!(M.id===h),withSenderName:R.isFirstInGroup&&o&&!k,threadId:b,messageListType:u,noComments:!1===j,appearanceOrder:I-++v,isFirstInGroup:R.isFirstInGroup,isLastInGroup:R.isLastInGroup,isFirstInDocumentGroup:R.isFirstInDocumentGroup,isLastInDocumentGroup:R.isLastInDocumentGroup,isLastInList:R.isLastInList}),M.id===h&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:"sticky-date",key:"date-header"},c.a.createElement("span",null,g&&t.originalDate===n.fb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.fb&&e("MessageScheduledOn",Object(R.c)(t.datetime,void 0,!0)),!g&&Object(R.c)(t.datetime))),Object(d.h)(w))});return Object(d.h)(y)}(ge,le||Ot([x]),ce,te,ie,pe,H,_,t,a,F,w,D,!!le&&"scheduled"===a,!le||!$.current)):c.a.createElement(ye.a,{color:"white"}))}));a(226);var Ga=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,canPost:c&&Object(m.e)(c,s),unreadCount:c&&s===i.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(d.l)(t,["focusLastMessage"]))(({isShown:e,messageListType:t,canPost:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(c.q)(null),o=Object(c.m)(()=>{if(e)if("thread"===t)n();else{const e=r.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(pt.a)(e,a,"end",20)}},[e,t,n]),i=Object(J.a)("ScrollDownButton",e&&"revealed",!a&&"no-composer");return c.a.createElement("div",{ref:r,className:i},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(ce.a,{color:"secondary",round:!0,onClick:o,ariaLabel:"Scroll to bottom"},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object($e.b)(s))))})),_a=a(122),za=a(123),Va=a(14);async function Wa(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:r}=t;let o,i;if(c.startsWith("image/"))if(a){const a=await Object(Va.g)(n),{width:r,height:i}=a;if(r>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),Wa(e,c,!0,s)):Wa(e,t,!1,s)}o={width:r,height:i}}else i=n;else if(c.startsWith("video/")){if(r<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Va.h)(n);o={width:e,height:t,duration:a}}i=await Object(Va.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var $a=a(171),Qa=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Ka={encoderPath:Qa,reuseWorker:!0},Ja={type:"audio/ogg"};let Ya,Za,Xa;async function es(){return Ya||(Ya=a.e(10).then(a.t.bind(null,304,7)),Za=(await Ya).default,Xa=new Za(Ka)),Ya}async function ts(e){await async function(){await es(),await Xa.start()}();const t=Date.now();let a;const s=[],n=[];Xa.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let r=!1;return function e(){if(r)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),o=a/n/255;t(o<.1?0:o),requestAnimationFrame(e)}(),()=>{r=!0}}(Xa,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{Xa.onstop=()=>{e({blob:new Blob(s,Ja),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},Xa.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Xa.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Xa.pause(),a=Date.now(),c()},e)}}}const as=["image/png","image/jpeg","image/gif"];function ss(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(wt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let ns,cs;var rs=a(58);var os=a(179);var is=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0};function ls(){return(ls=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,bs)return bs=!1,void e();ds&&(clearTimeout(ds),ds=void 0),ds=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(ce.a,ls({},t,{onMouseEnter:h.k?void 0:s,onMouseLeave:h.k?void 0:n,onClick:h.k?e:void 0}))});var ms=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0};var hs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0};var Os=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"MentionMenu",!t);return a?c.a.createElement(a,e):void 0};var js=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0};var gs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"EmojiTooltip",!t);return a?c.a.createElement(a,e):void 0};var fs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0},ps=a(172),Is=a(109);a(228);var vs=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.jb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let h,O;if(l?h=Object(o.k)(e,t,l):d?h=Object(o.D)(e,t,a,s):u&&1===i.length&&(h=Object(o.k)(e,c,i[0])),l&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.J)(e,h)),O||(O=Object(o.qb)(e,h))}else u&&(O=Object(m.lb)(c)?Object(o.Db)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:h,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(d.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:r,setReplyingToId:o,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&r),u=Object(Is.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(Y.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?o({messageId:void 0}):t?i({messageId:void 0}):r&&d()},[e,t,r,o,i,d]);Object(c.n)(()=>b?Object(X.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(J.a)("ComposerEmbeddedMessage",h),f=r&&r>1?r+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(ce.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(_t,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var ys=e=>{const{attachments:t}=e,a=Object(ve.a)(Ie.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0};var ws=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0};var Cs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0};a(229);const Es=/https?:\/\/(www.)?([a-zA-Z0-9.-]{2,256})([a-zA-Z/.-]{1,256})([?|#][=&#a-zA-Z0-9]{2,128})?/;var Ms=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.bb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(d.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,webPagePreview:s,noWebPage:n,loadWebPagePreview:r,clearWebPagePreview:o,toggleMessageWebPage:l})=>{const d=Object(c.p)(()=>{const{text:e,entities:t}=Object(za.a)(a),s=t&&t.find(({type:e})=>e===i.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Es);return n?n[0]:void 0},[a]);Object(c.n)(()=>{d?r({text:d}):(o(),l({chatId:e,threadId:t}))},[e,l,o,d,r,t]),Object(he.a)(()=>{o(),l({chatId:e,threadId:t})},[e]);if(!s||!a.length||n)return;const{photo:b,...u}=s,m={content:{webPage:u}};return c.a.createElement("div",{className:"WebPagePreview"},c.a.createElement(ce.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{l({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ya,{message:m,inPreview:!0}))})),Ss=a(114);var ks=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0};var Ns=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0};var Ps,Ts=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0};a(230);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Ps||(Ps={}));var As=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.N)(e,n):void 0,l=Object(o.O)(e,t),d=r&&Object(o.ab)(e,t),b=Object(o.lb)(e,t);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:l,canScheduleUntilOnline:!l&&!r&&n&&c&&Object(m.lb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),withScheduledButton:a===i.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(m.kb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers}},(e,t)=>Object(d.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:l,threadId:d,messageListType:b,draft:u,chat:O,connectionState:j,isChatWithBot:f,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:w,isPollModalOpen:C,isPaymentModalOpen:E,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:x,contentToBeScheduled:L,shouldSuggestStickers:F,sendMessage:D,editMessage:B,saveDraft:U,clearDraft:H,showError:q,setStickerSearchQuery:G,setGifSearchQuery:_,forwardMessages:z,openPollModal:V,closePollModal:W,loadScheduledHistory:$,closePaymentModal:Q,openChat:K,clearReceipt:Y})=>{const Z=Object(c.q)(null),[ee,te]=Object(c.r)(""),se=Object(c.q)(),ne=Object(qe.a)(e),[re,oe,ie]=Object(ct.a)(),[le,de]=Object(c.r)(),ue=Object(c.q)(ee);Object(c.n)(()=>{ue.current=ee},[ee]),Object(c.n)(()=>{se.current=void 0},[l]),Object(c.n)(()=>{l&&x&&d===i.MAIN_THREAD_ID&&$()},[l,$,x,d]),Object(c.o)(()=>{Z.current&&(Z.current.innerHTML='')},[]),Object(c.n)(()=>{L&&(de(L),oe())},[L,oe]);const[me,he]=Object(c.r)([]),[Oe,je,ge]=Object(ct.a)(),[fe,pe,Ie]=Object(ct.a)(),[ve,ye,we]=Object(ct.a)(),[Ce,Ee,Me]=Object(ct.a)(),[Se,ke]=Object(ct.a)(),[Ne,Pe,Te]=Object(ct.a)(),{startRecordingVoice:Ae,stopRecordingVoice:Re,pauseRecordingVoice:xe,activeVoiceRecording:Le,currentRecordTime:Fe,recordButtonRef:Be,startRecordTimeRef:Ue}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{h.d&&es()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ts(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))});s.current=Date.now(),r(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,r(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(X.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),He=o?Ps.Edit:!h.l||Le||ee&&!me.length||y?Ps.Send:Ps.Record,Ge=!t,{isMentionMenuOpen:_e,mentionFilter:ze,closeMentionMenu:Ve,insertMention:We,mentionFilteredMembers:$e}=Object(os.a)(w&&!me.length,ee,te,void 0,P,T,A),{isContextMenuOpen:Qe,handleContextMenu:Ke,handleContextMenuClose:Je,handleContextMenuHide:Ye}=Object(yt.a)(Be,!(He===Ps.Send&&Ge)),Ze=Object(c.p)(()=>Object(m.c)(O,f),[O,f]),et=O&&Object(m.gb)(O),tt=Object(m.k)(O),{isEmojiTooltipOpen:at,closeEmojiTooltip:st}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=h.c&&1===Object(rs.a)(t)||!h.c&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isEmojiTooltipOpen:i,closeEmojiTooltip:r}}(Boolean(F&&Ze.canSendStickers&&!me.length),ee,N),nt=Object(c.m)(e=>{const t=window.getSelection(),a=document.getElementById(n.u),s=Object(Xe.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(t.rangeCount){const n=t.getRangeAt(0);if(Object($a.a)(n))return void(h.c?document.execCommand("insertText",!1,e):(!function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n&&(a.setStartAfter(n),a.setEndAfter(n),t.removeAllRanges(),t.addRange(a))}}(s),a.dispatchEvent(new Event("input",{bubbles:!0}))));te(`${ue.current}${s}`),h.f||requestAnimationFrame(()=>{Object(_a.a)(a)})}else te(`${ue.current}${s}`)},[]),rt=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object($a.a)(t))return void document.execCommand("delete",!1)}te(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(ue.current))},[]),ot=Object(c.m)(()=>{te(""),he([]),st(),ie(),de(void 0),Ve(),h.f?setTimeout(()=>we(),350):we()},[st,ie,Ve,we]),it=Object(qe.a)(l);Object(c.n)(()=>{it&&l!==it&&(Re(),ot())},[l,it,ot,Re]);const lt=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(ss(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.u);Object(_a.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(za.a)(e.current);a&&(t||Object(m.cb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(ue,te,o,ot,Ee,B);((e,t,a,s,r,o,i,l,d)=>{const b=Object(c.m)((e,t)=>{r.current.length&&!i?l({chatId:e,threadId:t,draft:Object(za.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(g.a)(e=>e(),n.t,!1),[t]),m=Object(qe.a)(t),h=Object(qe.a)(a);Object(c.n)(()=>(ns=t,cs=a,()=>{ns=void 0,cs=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(ss(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.u);Object(_a.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(qe.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{ns===t&&cs===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,l,d,ee,ue,te,o,U,H),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.u,n.v].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>as.includes(e.type)),i=o&&o.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await Wa(i.name,i,!0);t(t=>[...t,e])}l&&e(l)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(nt,he,o);const dt=Object(c.m)(async(e,t)=>{he(await Promise.all(e.map(e=>Wa(e.name,e,t))))},[]),bt=Object(c.m)(()=>{he([])},[]),ut=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=me;if(Le){const e=await Re();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Wa("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(za.a)(ue.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;q({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(tt&&!et){const e=Math.floor(Date.now()/1e3),t=se.current&&Math.floor(e-se.current),a=tt.nextSendDate&&tt.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(de({sticker:e}),oe()):(D({sticker:e}),requestAnimationFrame(ot))},[t,oe,D,ot]),ht=Object(c.m)(e=>{t?(de({gif:e}),oe()):(D({gif:e}),requestAnimationFrame(ot))},[t,oe,D,ot]),Ot=Object(c.m)(e=>{t?(de({poll:e}),W(),oe()):(D({poll:e}),W())},[W,oe,D,t]),jt=Object(c.m)(()=>{t?(de({isSilent:!0}),oe()):ut(!0)},[ut,oe,t]),gt=Object(c.m)(e=>{const{isSilent:t,...a}=le||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);le&&0!==Object.keys(a).length?(D({...le,scheduledAt:s}),requestAnimationFrame(ot)):ut(!!t,s),ie()},[ie,ut,ot,le,D]),ft=Object(c.m)(()=>{gt(new Date(1e3*n.fb))},[gt]),pt=Object(c.m)(()=>{ie(),de(void 0)},[ie]),It=Object(c.m)(e=>{"stickers"===e?(G({query:""}),_({query:void 0})):(_({query:""}),G({query:void 0}))},[G,_]),vt=Object(c.m)(()=>{const e=document.getElementById(n.u);h.f&&e===document.activeElement?(e.blur(),setTimeout(()=>{ye()},100)):ye()},[ye]),wt=Object(c.m)(()=>{K({id:l,threadId:d,type:"scheduled"})},[K,l,d]);Object(c.n)(()=>{I&&h.f&&we()},[I,we]),Object(c.n)(()=>{v?Pe():setTimeout(()=>{Te()},200)},[v,Te,Pe]);const Ct=Object(c.m)(()=>{switch(He){case Ps.Send:t?(Le&&xe(),oe()):(ut(),requestAnimationFrame(ot));break;case Ps.Record:Ae();break;case Ps.Edit:lt()}},[He,ot,t,Ae,lt,Le,oe,xe,ut]),Et=Object(ae.a)(),Mt=He===Ps.Record&&!Ze.canAttachMedia,St=Object(qe.a)(o,!0),kt=o||St,Nt=new Date;Nt.setSeconds(0),Nt.setMilliseconds(0);const Pt=new Date;Pt.setFullYear(Pt.getFullYear()+1);let Tt="Send message";switch(He){case Ps.Edit:Tt="Save edited message";break;case Ps.Record:Tt=Mt?"Posting media content is not allowed in this group.":"Record a voice message"}const At=Object(J.a)("Composer",!v&&"shown",Ne&&"hover-disabled"),Rt=Object(J.a)("mobile-symbol-menu-button",Se?ve&&"menu-opened":ve&&"is-loading");return c.a.createElement("div",{className:At},Ze.canAttachMedia&&c.a.createElement(Ss.a,{containerId:"#middle-column-portals"},c.a.createElement(Cs,{isOpen:e!==De.a.None,withQuick:[e,ne].includes(De.a.QuickFile),onHide:r,onFileSelect:dt})),c.a.createElement(ys,{attachments:me,caption:me.length?ee:"",canSuggestMembers:w,groupChatMembers:P,currentUserId:T,usersById:A,onCaptionUpdate:te,onSend:t?oe:ut,onClear:bt}),c.a.createElement(ws,{isOpen:Boolean(C),onClear:W,onSend:Ot}),c.a.createElement(Ns,{isOpen:Boolean(E),onClose:Q}),c.a.createElement(Ts,{isOpen:Boolean(M),onClose:Y}),kt&&c.a.createElement(is,{isOpen:Ce,isSchedule:"scheduled"===b,onClose:Me,message:kt}),c.a.createElement(Os,{isOpen:_e,filter:ze,onClose:Ve,onInsertUserName:We,filteredChatMembers:$e,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:Z}),c.a.createElement(vs,null),Ze.canAttachEmbedLinks&&c.a.createElement(Ms,{chatId:l,threadId:d,messageText:me.length?"":ee}),c.a.createElement("div",{className:"message-input-wrapper"},h.f?c.a.createElement(ce.a,{className:Rt,round:!0,color:"translucent",onClick:ve?we:vt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(be.a,{color:"gray"})):c.a.createElement(us,{className:""+(ve?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ye,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(ps.a,{id:"message-input-text",html:me.length?"":ee,placeholder:Le&&window.innerWidth<=600?"":Et("Message"),shouldSetFocus:ve,shouldSupressFocus:h.f&&ve,onUpdate:te,onSend:He===Ps.Edit?lt:t?oe:ut,onSupressedFocus:we}),k&&c.a.createElement(ce.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:wt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Le&&!o&&c.a.createElement(us,{className:""+(Oe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:je,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Le&&!o&&c.a.createElement(us,{className:""+(fe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:pe,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Le&&Fe&&c.a.createElement("span",{className:"recording-state"},Object(R.i)(Fe-Ue.current)),c.a.createElement(gs,{isOpen:at,onStickerSelect:mt}),c.a.createElement(ms,{isOpen:fe,allowedAttachmentOptions:Ze,onFileSelect:dt,onPollCreate:V,onClose:Ie}),S&&c.a.createElement(fs,{messageId:S,isOpen:Oe,onClose:ge}),c.a.createElement(hs,{isOpen:ve,allowedAttachmentOptions:Ze,onLoad:ke,onClose:we,onEmojiSelect:nt,onStickerSelect:mt,onGifSelect:ht,onRemoveSymbol:rt,onSearchOpen:It}))),Le&&c.a.createElement(ce.a,{round:!0,color:"danger",className:"cancel",onClick:Re,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(ce.a,{ref:Be,round:!0,color:"secondary",className:`${He} ${Le?"recording":""}`,disabled:Mt,ariaLabel:Tt,onClick:Ct,onContextMenu:He===Ps.Send&&Ge?Ke:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),Ge&&c.a.createElement(js,{isOpen:Qe,onSilentSend:p?void 0:jt,onScheduleSend:t?void 0:oe,onClose:Je,onCloseAnimationEnd:Ye}),c.a.createElement(ks,{isOpen:re,withTimePicker:!0,selectedAt:Nt.getTime(),maxAt:Object(R.k)(Pt),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:pt,onSubmit:gt,onSecondButtonClick:a?ft:void 0}))}));var Rs=e=>{const{isActive:t}=e,a=Object(ve.a)(Ie.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0};var xs=e=>{const{isActive:t}=e,a=Object(ve.a)(Ie.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0};var Ls=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0};a(231);const Fs=h.f?450+n.c:void 0;function Ds(e){return"file"===e.kind&&e.type&&n.k.includes(e.type)}var Bs=Object(c.h)(Object(s.h)(e=>{const{isBackgroundBlurred:t,customBackground:a,patternColor:s}=e.settings.byKey,n=Boolean((a||"").match(/^#[a-f\d]{6,8}$/i)),c=Object(o.y)(e),{chats:{listIds:r}}=e;if(!c||!r.active)return{customBackground:a,isBackgroundBlurred:t,isCustomBackgroundColor:n};const{chatId:i,threadId:l,type:d}=c,b=Object(o.f)(e,i),u=Object(o.gb)(e,i),{chatId:O,messageId:j}=e.audioPlayer,g=b&&Object(m.e)(b,l),f=Object(o.K)(e,i),p="pinned"===d;return{chatId:i,threadId:l,messageListType:d,isPrivate:Object(m.lb)(i),canPost:!p&&(!b||g)&&(!f||h.f),isPinnedMessageList:p,messageSendingRestrictionReason:b&&Object(m.J)(b),hasPinnedOrAudioMessage:Boolean(u&&u.length)||Boolean(O&&j),customBackground:a,patternColor:s,isCustomBackgroundColor:n,isRightColumnShown:Object(o.V)(e),isBackgroundBlurred:t,isMobileSearchActive:Boolean(h.f&&Object(o.A)(e)),isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel}},(e,t)=>Object(d.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:l,hasPinnedOrAudioMessage:d,customBackground:b,patternColor:u,isCustomBackgroundColor:m,isRightColumnShown:O,isBackgroundBlurred:j,isMobileSearchActive:g,isSelectModeActive:f,animationLevel:p,openChat:I,unpinAllMessages:v,loadUser:y})=>{const{width:w}=He(),[C,E]=Object(c.r)(De.a.None),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(!1),P=Ge(e,Fs),T=Ge(t,Fs),A=Ge(a,Fs),R=Ge(o,Fs);Object(c.n)(()=>e?Object(X.a)(()=>{I({id:void 0})}):void 0,[e,I]),Object(c.n)(()=>{E(De.a.None)},[e]),Object(c.n)(()=>{s&&y({userId:e})},[e,s,y]);const x=Object(c.m)(e=>{if(h.k)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(Ds);E(a?De.a.QuickFile:De.a.Document)},[]),L=Object(c.m)(()=>{E(De.a.None)},[]),F=Object(c.m)(()=>{N(!0)},[]),D=Object(c.m)(()=>{N(!1)},[]),B=Object(c.m)(()=>{v({chatId:e}),D(),I({id:e})},[v,I,D,e]),U=(e=>{const[t,a]=Object(c.r)(e);return Object(c.n)(()=>{e&&(e.startsWith("#")?a(e):Be.c(n.l,n.l,Be.a.Blob).then(e=>{a("url("+URL.createObjectURL(e))}))},[e]),t})(b),H=d&&(wn.W&&w=n.V&&w_e(w,R),[R,w]),K=Object(ae.a)();return c.a.createElement("div",{id:"MiddleColumn",className:q,style:`\n --composer-hidden-scale: ${_};\n --toolbar-hidden-scale: ${z};\n --unpin-hidden-scale: ${$};\n --toolbar-unpin-hidden-scale: ${Q};\n --composer-translate-x: ${V}px;\n --toolbar-translate-x: ${W}px;\n --pattern-color: ${u};\n `},c.a.createElement("div",{id:"middle-column-bg",style:U?"--custom-background: "+U:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),P&&T&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:R?x:void 0},c.a.createElement(ut,{chatId:P,threadId:T,messageListType:A}),c.a.createElement(ee.a,{name:p===n.e?"slide":"fade",activeKey:"thread"===A&&T===i.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(qa,{key:`${P}-${T}-${A}`,chatId:P,threadId:T,type:A,hasTools:H,onFabToggle:S,bottomOffset:R?"none":r?"big":"small"}),c.a.createElement("div",{className:Object(J.a)("middle-column-footer",!R&&"no-composer")},R&&c.a.createElement(As,{chatId:P,threadId:T,messageListType:A,dropAreaState:C,onDropHide:L}),r&&c.a.createElement("div",{className:"unpin-button-container"},c.a.createElement(ce.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:F},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,K("Chat.PanelHidePinnedMessages")))),!r&&!R&&l&&c.a.createElement("div",{className:G},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,l))),c.a.createElement(xs,{messageListType:A,isActive:f,canPost:R})))),c.a.createElement(Ga,{isShown:M})),h.f&&c.a.createElement(Rs,{isActive:Boolean(g)})),e&&c.a.createElement(Ls,{isOpen:k,chatId:e,onClose:D,onUnpin:B}))}));a(232);const Us=Object(g.a)(e=>e(),200,!1);var Hs;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Statistics=4]="Statistics",e[e.Management=5]="Management",e[e.ManageInitial=6]="ManageInitial",e[e.ManageChannelSubscribers=7]="ManageChannelSubscribers",e[e.ManageChatAdministrators=8]="ManageChatAdministrators",e[e.ManageChatPrivacyType=9]="ManageChatPrivacyType",e[e.ManageDiscussion=10]="ManageDiscussion",e[e.ManageGroupPermissions=11]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=12]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=13]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=14]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=15]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=16]="ManageGroupAdminRights",e[e.ManageGroupMembers=17]="ManageGroupMembers",e[e.StickerSearch=18]="StickerSearch",e[e.GifSearch=19]="GifSearch",e[e.PollResults=20]="PollResults"}(Hs||(Hs={}));var qs=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(m.jb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.O)(e,i.id)&&(Object(m.lb)(i.id)||(Object(m.gb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(d.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","searchMessagesByDate"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStatistics:n,isStickerSearch:r,isGifSearch:o,isPollResults:i,profileState:d,managementScreen:b,canManage:u,isChannel:m,onClose:O,messageSearchQuery:j,stickerSearchQuery:g,gifSearchQuery:f,setLocalTextSearchQuery:p,setStickerSearchQuery:I,setGifSearchQuery:v,searchTextMessagesLocal:y,toggleManagement:w,searchMessagesByDate:C})=>{var E;const M=Object(c.q)(null),[S,k,N]=Object(ct.a)(),P=Object(c.m)(e=>{p({query:e}),e.length&&Us(y)},[y,p]),T=Object(c.m)(e=>{C({timestamp:e.valueOf()/1e3}),N()},[N,C]),A=Object(c.m)(e=>{I({query:e})},[I]),R=Object(c.m)(e=>{v({query:e})},[v]),[x,L]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{L(!e)},300)},[e]);const F=Object(ae.a)(),D=t?d===l.k.Profile?Hs.Profile:d===l.k.SharedMedia?Hs.SharedMedia:d===l.k.MemberList?Hs.MemberList:-1:a?Hs.Search:i?Hs.PollResults:r?Hs.StickerSearch:o?Hs.GifSearch:s?b===l.g.Initial?Hs.ManageInitial:b===l.g.ChatPrivacyType?Hs.ManageChatPrivacyType:b===l.g.Discussion?Hs.ManageDiscussion:b===l.g.ChannelSubscribers?Hs.ManageChannelSubscribers:b===l.g.GroupPermissions?Hs.ManageGroupPermissions:b===l.g.ChatAdministrators?Hs.ManageChatAdministrators:b===l.g.GroupRemovedUsers?Hs.ManageGroupRemovedUsers:b===l.g.GroupUserPermissionsCreate?Hs.ManageGroupUserPermissionsCreate:b===l.g.GroupUserPermissions?Hs.ManageGroupUserPermissions:b===l.g.GroupRecentActions?Hs.ManageGroupRecentActions:b===l.g.ChatAdminRights?Hs.ManageGroupAdminRights:b===l.g.GroupMembers?Hs.ManageGroupMembers:void 0:n?Hs.Statistics:void 0,B=null!==(E=We(D,!0))&&void 0!==E?E:-1;function U(){if(-1!==B)switch(B){case Hs.PollResults:return c.a.createElement("h3",null,F("PollResults"));case Hs.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(re.a,{value:j,onChange:P}),c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",onClick:k,ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case Hs.ManageInitial:return c.a.createElement("h3",null,F("Edit"));case Hs.ManageChatPrivacyType:return c.a.createElement("h3",null,F(m?"ChannelTypeHeader":"GroupTypeHeader"));case Hs.ManageDiscussion:return c.a.createElement("h3",null,F("Discussion"));case Hs.ManageChatAdministrators:return c.a.createElement("h3",null,F("ChannelAdministrators"));case Hs.ManageGroupRecentActions:return c.a.createElement("h3",null,F("Group.Info.AdminLog"));case Hs.ManageGroupAdminRights:return c.a.createElement("h3",null,F("EditAdminRights"));case Hs.ManageGroupPermissions:return c.a.createElement("h3",null,F("ChannelPermissions"));case Hs.ManageGroupRemovedUsers:return c.a.createElement("h3",null,F("ChannelBlockedUsers"));case Hs.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,F("ChannelAddException"));case Hs.ManageGroupUserPermissions:return c.a.createElement("h3",null,F("UserRestrictions"));case Hs.StickerSearch:return c.a.createElement(re.a,{value:g,placeholder:"Search Stickers",onChange:A});case Hs.GifSearch:return c.a.createElement(re.a,{value:f,placeholder:F("SearchGifsTitle"),onChange:R});case Hs.Statistics:return c.a.createElement("h3",null,F("Statistics"));case Hs.SharedMedia:return c.a.createElement("h3",null,F("SharedMedia"));case Hs.ManageChannelSubscribers:return c.a.createElement("h3",null,F("ChannelSubscribers"));case Hs.MemberList:case Hs.ManageGroupMembers:return c.a.createElement("h3",null,F("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,F("Info")),c.a.createElement("section",{className:"tools"},u&&c.a.createElement(ce.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:F("Edit"),onClick:w},c.a.createElement("i",{className:"icon-edit"}))))}}const H=h.f||D===Hs.SharedMedia||D===Hs.MemberList||s,q=Object(J.a)("animated-close-icon",x&&"no-transition");return Object(c.n)(()=>{M.current.classList.toggle("state-back",H)},[H]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(ce.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:O,ariaLabel:F(H?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:M,className:q})),c.a.createElement(ee.a,{name:x?"none":"slide-fade",activeKey:B},U),!h.f&&c.a.createElement(ks,{isOpen:S,isPastMode:!0,submitButtonLabel:F("JumpToDate"),onClose:N,onSubmit:T}))})),Gs=a(118);function _s(e,t,a,s,r,o){const i=Object(c.q)();Object(he.a)(()=>{t===e&&r&&o&&(i.current=Object(m.w)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(Gs.a)(s?a:void 0,i.current,void 0,"media"===e?n.hb:n.T);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var zs=a(52);const Vs=Object(g.g)(e=>e(),250,!1);let Ws=!1;var $s=a(101),Qs=a(94);var Ks=Object(c.h)(Object(s.h)((e,{userId:t})=>{const{lastSyncTime:a}=e;return{lastSyncTime:a,user:Object(o.Db)(e,t)}},(e,t)=>Object(d.l)(t,["loadFullUser"]))(({lastSyncTime:e,user:t,forceShowSelf:a,loadFullUser:s})=>{const{id:n,fullInfo:r,username:o,phoneNumber:i,isSelf:l}=t||{};Object(c.n)(()=>{e&&s({userId:n})},[s,n,e]);const d=Object(ae.a)();if(!t||l&&!a)return;const b=r&&r.bio,u=i&&Object(ba.c)(i);return c.a.createElement("div",{className:"ChatExtra"},b&&!!b.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-info"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(b,["br","links","emoji"])),c.a.createElement("p",{className:"subtitle"},d("UserBio")))),o&&!!o.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-mention"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(o)),c.a.createElement("p",{className:"subtitle"},d("Username")))),u&&!!u.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-phone"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},u),c.a.createElement("p",{className:"subtitle"},d("Phone")))))}));var Js=Object(c.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(o.f)(e,t);return{chat:a,canInviteUsers:a&&(!Object(m.jb)(a)&&!Object(m.yb)(a,"inviteUsers")||Object(m.q)(a,"inviteUsers"))}})(({chat:e,canInviteUsers:t})=>{const a=Object(ae.a)();if(!e||e.isRestricted)return;const s=Object(m.g)(e),n=Object(m.h)(e),r=0===n.indexOf("http")?n:"http://"+n;return c.a.createElement("div",{className:"ChatExtra"},s&&!!s.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-info"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(s,["br","links","emoji"])),c.a.createElement("p",{className:"subtitle"},a("Info")))),t&&!!n.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-mention"}),c.a.createElement("div",null,c.a.createElement(va.a,{url:r,className:"title",text:n}),c.a.createElement("p",{className:"subtitle"},a("SetUrlPlaceholder")))))})),Ys=a(154),Zs=a(173),Xs=a(108);a(236);const en=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function tn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var an=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(m.kb)(s),b=s&&Object(m.jb)(s),u=d||b&&Object(m.gb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(m.lb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&h&&{members:h,usersById:l},isRightColumnShown:Object(o.V)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(d.l)(t,["setLocalMediaSearchType","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:d,mediaSearchType:b,hasMembersTab:u,areMembersHidden:O,members:j,usersById:g,isRightColumnShown:f,isRestricted:p,lastSyncTime:I,setLocalMediaSearchType:v,searchMediaMessagesLocal:y,openMediaViewer:w,openAudioPlayer:C,openUserInfo:E,focusMessage:M})=>{const S=Object(c.q)(null),k=Object(c.q)(null),[N,P]=Object(c.r)(0),T=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...en],[u,s]),A=T[N].type,[R,x,L,F]=function(e,t,a,s,n,r,o,i,l,d){const b="members"!==a&&s?s:a,u=Object(c.p)(()=>{if(n&&r)return Object(m.W)(n.map(({userId:e})=>e),r)},[n,r]),[h,O,j]=_s("media",b,t,d,o,i),[g,f,p]=_s("documents",b,t,d,o,i),[I,v,y]=_s("links",b,t,d,o,i),[w,C,E]=_s("audio",b,t,d,o,i);let M,S,k=!1;switch(b){case"members":M=u,S=void 0;break;case"media":M=h,S=O,k=j;break;case"documents":M=g,S=f,k=p;break;case"links":M=I,S=v,k=y;break;case"audio":M=w,S=C,k=E}return[b,M,S,k]}(0,y,A,b,j,g,o,d,0,I),D=T.findIndex(({type:e})=>e===R),{handleScroll:B}=function(e,t,a,s){Object(zs.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Ws=!1},350))}},[t,s]),Object(zs.a)(([t])=>{if(a!==l.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Ws=!0,Object(pt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Ws=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=l.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?l.k.MemberList:l.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Ws||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Ws||Vs(n)},[n])}}(S,A,t,a),{applyTransitionFix:U,releaseTransitionFix:H}=function(e){return Object(c.n)(()=>{function t(){const t=e.current,a=t.querySelector(".Transition"),s=t.querySelector(".TabList");a&&s&&(a.style.minHeight=t.offsetHeight-s.offsetHeight+"px")}return t(),window.addEventListener("resize",t,!1),()=>{window.removeEventListener("resize",t,!1)}},[e]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(S),[q,G]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),_=Object(c.m)(()=>{H(),G()},[H,G]);Object(c.n)(()=>{v({mediaType:A})},[v,A]);const z=r||e,V=Object(c.m)(e=>{w({chatId:z,threadId:i.MAIN_THREAD_ID,messageId:e,origin:l.h.SharedMedia})},[z,w]),W=Object(c.m)(e=>{C({chatId:z,messageId:e})},[z,C]),$=Object(c.m)(e=>{E({id:e})},[E]),Q=Object(c.m)(e=>{M({chatId:z,messageId:e})},[z,M]);let K;Object(c.n)(()=>{if(k.current&&h.k)return Object(me.b)(k.current,{onSwipe:(e,t)=>{t===me.a.Left?P(Math.min(N+1,T.length-1)):t===me.a.Right&&P(Math.max(0,N-1))}})},[N,T.length]);const J="members"===R||!u&&"media"===R;J?K=f?0:1e3:x||(K=n.ib);const Y=Object(Is.a)([e,R],K);function Z(){if(!x||!Y||!o){const e=J&&x&&!Y;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(be.a,null))}if(!x.length){let e;switch(R){case"members":e=O?"You have no access to group members list.":"No members found";break;case"documents":e="No documents found.";break;case"links":e="No links found.";break;case"audio":e="No audio found.";break;default:e="No media found."}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(Xs.a,{text:e}))}return c.a.createElement("div",{className:`content ${R}-list`,teactFastList:!0},"media"===R?x.map(e=>o[e]&&c.a.createElement(Ys.a,{key:e,message:o[e],onClick:V})):"documents"===R?x.map(e=>o[e]&&c.a.createElement(zt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Q})):"links"===R?x.map(e=>o[e]&&c.a.createElement(Zs.a,{key:e,message:o[e],onMessageClick:Q})):"audio"===R?x.map(e=>o[e]&&c.a.createElement(Vt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:I,className:"scroll-item",onPlay:W,onDateClick:Q})):"members"===R?x.map((e,t)=>c.a.createElement(Qs.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>$(e)},c.a.createElement(Qe.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement($s.a,{ref:S,className:"Profile custom-scroll",itemSelector:tn(R),items:x,cacheBuster:q,preloadBackwards:n.hb,isDisabled:"members"===A,noFastList:!0,onLoadMore:L,onScroll:B},!F&&function(e,t){return c.a.createElement("div",{className:"profile-info"},t?c.a.createElement(c.a.Fragment,null,c.a.createElement(Qe.a,{userId:t,avatarSize:"jumbo",forceShowSelf:t!==e,withMediaViewer:!0,withFullInfo:!0}),c.a.createElement(Ks,{userId:t,forceShowSelf:t!==e})):c.a.createElement(c.a.Fragment,null,c.a.createElement(Ke.a,{chatId:e,avatarSize:"jumbo",withMediaViewer:!0,withFullInfo:!0}),c.a.createElement(Js,{chatId:e})))}(e,r),!p&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ee.a,{ref:k,name:"slide",activeKey:D,renderCount:T.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:U,onStop:_},Z),c.a.createElement(ge.a,{activeTab:N,tabs:T,onSwitchTab:P})))}));var sn=e=>{const t=Object(ve.a)(Ie.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var nn=e=>{const t=Object(ve.a)(Ie.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var cn=()=>{const e=Object(ve.a)(Ie.a.Extra,"Statistics");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var rn=()=>{const e=Object(ve.a)(Ie.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var on=()=>{const e=Object(ve.a)(Ie.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var ln=()=>{const e=Object(ve.a)(Ie.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};a(237);const dn=Object.keys(l.l).length/2,bn=Object.keys(l.g).length/2;function un(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var mn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.kb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(d.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","toggleStatistics","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,toggleStatistics:d,openUserInfo:b,closeLocalTextSearch:u,setStickerSearchQuery:m,setGifSearchQuery:h,closePollResults:O})=>{var j;const{width:g}=He(),[f,p]=Object(c.r)(l.k.Profile),[I,v]=Object(c.r)(l.g.Initial),[y,w]=Object(c.r)(),[C,E]=Object(c.r)(),M=f!==l.k.Profile,S=void 0!==e,k=e===l.l.ChatInfo||e===l.l.UserInfo,N=e===l.l.Search,P=e===l.l.Management,T=e===l.l.Statistics,A=e===l.l.StickerSearch,R=e===l.l.GifSearch,x=e===l.l.PollResults,L=g<=n.W,[F,D]=Object(c.r)(!S),B=null!==(j=We(e,!0,!r))&&void 0!==j?j:-1,U=Object(c.m)(()=>{switch(e){case l.l.ChatInfo:if(M){p(l.k.Profile);break}o();break;case l.l.UserInfo:if(M){p(l.k.Profile);break}b({id:void 0});break;case l.l.Management:switch(I){case l.g.Initial:i();break;case l.g.ChatPrivacyType:case l.g.Discussion:case l.g.GroupPermissions:case l.g.GroupType:case l.g.ChatAdministrators:case l.g.ChannelSubscribers:case l.g.GroupMembers:v(l.g.Initial);break;case l.g.GroupUserPermissionsCreate:case l.g.GroupRemovedUsers:case l.g.GroupUserPermissions:v(l.g.GroupPermissions),w(void 0),E(void 0);break;case l.g.ChatAdminRights:case l.g.GroupRecentActions:v(l.g.ChatAdministrators)}break;case l.l.Statistics:d();break;case l.l.Search:un(),u();break;case l.l.StickerSearch:case l.l.GifSearch:un(),m({query:void 0}),h({query:void 0});break;case l.l.PollResults:O()}},[e,M,o,b,d,O,I,i,u,m,h]),H=Object(c.m)((e,t)=>{w(e),E(t)},[]);function q(){if(-1!==B)switch(B){case l.l.ChatInfo:case l.l.UserInfo:return c.a.createElement(an,{key:s||t,chatId:t,userId:s,profileState:f,onProfileStateChange:p});case l.l.Search:return c.a.createElement(sn,{chatId:t,threadId:a});case l.l.Management:return c.a.createElement(nn,{chatId:t,currentScreen:I,isPromotedByCurrentUser:C,selectedChatMemberId:y,onScreenSelect:v,onChatMemberSelect:H});case l.l.Statistics:return c.a.createElement(cn,null);case l.l.StickerSearch:return c.a.createElement(rn,null);case l.l.GifSearch:return c.a.createElement(on,null);case l.l.PollResults:return c.a.createElement(ln,null)}}return Object(c.n)(()=>S?Object(X.a)(U):void 0,[S,U]),Object(c.n)(()=>{setTimeout(()=>{D(!S)},300)},[S]),Object(c.n)(()=>{S&&L&&U()},[L]),Object(mt.a)(([a,s])=>{(a===l.l.ChatInfo&&e===l.l.UserInfo||a===l.l.UserInfo&&e===l.l.ChatInfo||s!==t)&&(p(l.k.Profile),v(l.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},L&&c.a.createElement("div",{className:"overlay-backdrop",onClick:U}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement(qs,{chatId:t,isColumnOpen:S,isProfile:k,isSearch:N,isManagement:P,isStatistics:T,isStickerSearch:A,isGifSearch:R,isPollResults:x,profileState:f,managementScreen:I,onClose:U}),c.a.createElement(ee.a,{name:F?"none":"zoom-fade",renderCount:dn+bn,activeKey:P?dn+I:B},q)))}));var hn=Object(c.h)(({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var On=({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0};var jn=({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0};var gn=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0};a(238);let fn,pn,In=!1;function vn(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}var yn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.V)(e),isMediaViewerOpen:Object(o.S)(e),isForwardModalOpen:Object(o.Q)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s}},(e,t)=>Object(d.l)(t,["loadAnimatedEmojis"]))(({lastSyncTime:e,loadAnimatedEmojis:t,isLeftColumnShown:a,isRightColumnShown:r,isMediaViewerOpen:i,isForwardModalOpen:l,animationLevel:d,hasNotifications:b,hasErrors:u,audioMessage:m})=>{n.o&&!In&&(In=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&t()},[e,t]);const{transitionClassNames:h}=Object(Y.a)(!a,void 0,!0),{transitionClassNames:O}=Object(Y.a)(r,void 0,!0),j=Object(J.a)(h.replace(/([\w-]+)/g,"middle-column-$1"),O.replace(/([\w-]+)/g,"right-column-$1"));function g(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",j.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",j.includes("right-column-open"))},[j]),Object(c.n)(()=>{d>0&&(document.body.classList.add("animating-right-column"),Object(K.b)(350+n.c),fn&&(clearTimeout(fn),fn=void 0),fn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),fn=void 0},350+n.c))},[d,r]),Object(Z.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(pn),pn=window.setInterval(()=>{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,vn(!0))}else document.title="Telegram",vn(!1);t++},1e3)},()=>{clearInterval(pn),pn=void 0,document.title="Telegram",vn(!1)}),c.a.createElement("div",{id:"Main",className:j,onDrop:g,onDragOver:g},c.a.createElement(Fe,null),c.a.createElement(Bs,null),c.a.createElement(mn,null),c.a.createElement(hn,{isOpen:i}),c.a.createElement(gn,{isOpen:l}),c.a.createElement(On,{isOpen:b}),c.a.createElement(jn,{isOpen:u}),m&&c.a.createElement(bt,{key:m.id,message:m,noUi:!0}))}));n.o&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()}}]); -//# sourceMappingURL=3.b70839d141349ff143e4.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{106:function(e,t,a){"use strict";function s(e){const t=e.length;let a=e[0],s=e[0];for(let n=0;na?a=t:tvoid 0!==a[s]?a[s]:void 0!==t[s]?t[s]:e[s]})}function o(e,t,a=!0){let s,n,c=null;return(...r)=>{s=!0,n=r,c||(a&&(s=!1,e(...n)),c=window.setInterval(()=>{if(!s)return window.clearInterval(c),void(c=null);s=!1,e(...n)},t))}}function i(e){let t,a=!1;return function(...s){t=s,a||(a=!0,requestAnimationFrame(()=>{a=!1,e(...t)}))}}function l(e,t,a=!0,s=!0){let n=null;return function(){n?(clearTimeout(n),n=null):a&&e(),n=setTimeout(()=>{s&&e(),n=null},t)}}a.d(t,"b",(function(){return s})),a.d(t,"c",(function(){return n})),a.d(t,"e",(function(){return c})),a.d(t,"d",(function(){return r})),a.d(t,"f",(function(){return o})),a.d(t,"g",(function(){return i})),a.d(t,"a",(function(){return l}))},186:function(e,t,a){},187:function(e,t,a){},188:function(e,t,a){},200:function(e,t,a){},201:function(e,t,a){},202:function(e,t,a){},205:function(e,t,a){},206:function(e,t,a){},207:function(e,t,a){},211:function(e,t,a){},212:function(e,t,a){},214:function(e,t,a){},217:function(e,t,a){},218:function(e,t,a){},219:function(e,t,a){},220:function(e,t,a){},221:function(e,t,a){},222:function(e,t,a){},223:function(e,t,a){},224:function(e,t,a){},225:function(e,t,a){},226:function(e,t,a){},227:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},233:function(e,t,a){},237:function(e,t,a){},238:function(e,t,a){},239:function(e,t,a){},92:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return yn}));var s=a(2),n=a(1),c=a(0),r=(a(75),a(39)),o=a(6);window.addEventListener("popstate",e=>{if(!e.state)return;const{chatId:t,threadId:a,messageListType:n}=e.state;Object(s.d)().openChat({id:t,threadId:a,type:n,noPushState:!0})}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",noPushState:l}=a,d=Object(o.y)(e);return d&&d.chatId===n&&d.threadId===c&&d.type===i||(e=Object(r.m)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),l||window.history.pushState({chatId:n,threadId:c,messageListType:i},"")),Object(r.L)(e,n,c,i)}),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0}));var i=a(5),l=a(18),d=a(3);let b;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.v)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.v)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.v)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Eb)(e,t,a);if(!s||!n)return;const c=Object(d.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.v)(e,t,a,"editingId",c):void 0}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,origin:o}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,origin:o},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(o.V)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===i.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.zb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=i.MAIN_THREAD_ID,messageListType:d="thread",noHighlight:u,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.I)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||d!==j.type;b&&(clearTimeout(b),b=void 0),b=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.N)(e),e=Object(r.M)(e),Object(s.g)(e)},2e3),e=Object(r.N)(e,n,O,u),e=Object(r.M)(e,void 0),g&&(e=Object(r.M)(e,l.b.Static));const f=Object(o.Eb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.v)(e,n,c,"viewportIds",void 0)),e=Object(r.v)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?l.b.Down:l.b.Up;e=Object(r.M)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let r;return c&&(r=Object(o.Z)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:r||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(o.r)(e);return n?Object(r.l)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.E)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.m),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(r.P)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(r.P)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.P)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.P)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.Q)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.P)(e,{chatId:s,query:void 0,resultsByType:void 0})});var u=a(45),m=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return Object(r.W)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return e=Object(r.W)(e,t,a,!1),e=Object(r.s)(e,t,a,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(m.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.s)(e,s,n,u.a)),e=Object(r.W)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.V)(e,s,n)}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(r.db)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.u)(e,a));var h=a(7),O=a(159);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("toggleStatistics",e=>({...e,isStatisticsShown:!e.isStatisticsShown})),Object(s.b)("openChat",(e,t,a)=>{if(!h.f)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(O.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(r.g)(e);return Object(r.h)(t)});a(76);var j=a(10),g=a(9);const f=Object(g.g)(e=>e(),1e3,!0),p=Object(g.g)(e=>e(),3e3,!0),I=Object(g.a)(e=>e(),500,!1,!0),v=Object(g.a)(e=>e(),500,!1,!0);async function y(e,t,a){const c=await Object(j.a)("fetchChats",{limit:n.i,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let l=Object(s.e)();l=Object(r.e)(l,Object(d.c)(c.users,"id")),l=Object(r.K)(l,Object(d.c)(c.chats,"id")),l=Object(r.G)(l,e,o),l=Object(r.H)(l,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{l=Object(r.v)(l,e,i.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{l=Object(r.v)(l,e,i.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||l.chats.isFullyLoaded[e]||(l={...l,chats:{...l.chats,isFullyLoaded:{...l.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(l)}async function w(e){const t=await Object(j.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.e)(c,Object(d.c)(a,"id"))),c=Object(r.F)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function C(e,t,a){const n=Object(s.e)(),c=Object(o.h)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(o.r)(n);e.openChat({id:-1});const l=await Object(j.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(r.F)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==l&&!a.includes(e));if(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:i.MAIN_THREAD_ID}),h.k&&t.loadPinnedMessages({chatId:u.id})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(m.mb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(j.a)("fetchChat",{type:"self"});else{const t=Object(o.Db)(e,s);t&&Object(j.a)("fetchChat",{type:"user",user:t})}if(n!==i.MAIN_THREAD_ID){Object(o.Bb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.xb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(j.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.vb})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(o.M)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;f(c?()=>y(s,c.id,c.lastMessage.date):()=>y(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?w(c):I(()=>w(c)))}),Object(s.b)("loadSuperGroupOnlines",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&v(()=>Object(j.a)("fetchSuperGroupOnlines",n))}),Object(s.b)("loadTopChats",()=>{p(()=>y("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(j.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatMutedState",{chat:c,isMuted:n})}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:d}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const c=await Object(j.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let d=Object(s.e)();d=Object(r.F)(d,o,c),d={...d,chatCreation:{...d.chatCreation,progress:c?l.a.Complete:l.a.Error}},Object(s.g)(d),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(j.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,d.map(t=>Object(o.Db)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("leaveChannel",{channelId:c,accessHash:r})}),Object(s.b)("deleteChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("deleteChannel",{channelId:c,accessHash:r})}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const n=await Object(j.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.F)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?l.a.Complete:l.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(j.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Db)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.M)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(j.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.M)(e,s,"archived"===t?n.g:void 0);Object(j.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleChatArchived",{chat:c,folderId:Object(m.hb)(c)?0:n.g})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(o.i)(e,s);c&&Object(j.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:r}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(j.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const r=Object(s.e)(),{recommended:o}=r.chatFolders;o&&Object(s.g)({...r,chatFolders:{...r.chatFolders,recommended:o.filter(({id:e})=>e!==a)}})}(c,r&&r.length?Math.max.apply(Math.max,r):n.g)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(j.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(j.a)("markMessageListRead",{chat:n,threadId:i.MAIN_THREAD_ID}):Object(j.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.bb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(j.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.cb.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;C(t,e,a)}}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;C(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(o.f)(e,s);c&&(async()=>{if(Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(j.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Db)(e,c);l&&d&&(async()=>{if(Object(m.ib)(l)){if(l=await Object(j.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(j.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.F)(e,n,{fullInfo:{...a.fullInfo,...b&&h&&{members:b.filter(e=>e.userId!==c)},...b&&!h&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Db)(e,c);d&&b&&(async()=>{if(Object(m.ib)(d)){if(d=await Object(j.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(j.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.F)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!h&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:d}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.InProgress)),await Promise.all([b.title!==c?Object(j.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(j.a)("updateChatAbout",b,i):void 0,d?Object(j.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:d}):void 0]),Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(j.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(r.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(o.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(m.ib)(r)){if(r=await Object(j.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(j.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(j.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(j.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(j.a)("setDiscussionGroup",{channel:n}),c&&w(c)})()});var E=a(160);const M=new Map;async function S(e,t,a,c,i=!1,b=!1){const u=e.id;let m;switch(c){case l.e.Backwards:m=void 0;break;case l.e.Around:m=-(Math.round(n.R/2)+1);break;case l.e.Forwards:m=-(n.R+1)}const h=await Object(j.a)("fetchMessages",{chat:Object(o.Ab)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.R,threadId:t});if(!h)return;const{messages:O,users:g,chats:f,threadInfos:p,firstMessageId:I}=h,v=Object(d.c)(O,"id"),y=Object.keys(v).map(Number);let w=Object(s.e)();w=Object(r.b)(w,u,v),w=i?Object(r.bb)(w,u,t,y):Object(r.T)(w,u,t,y),w=Object(r.e)(w,Object(d.c)(g,"id")),w=Object(r.c)(w,Object(d.c)(f,"id")),w=Object(r.jb)(w,u,p),I&&(w=Object(r.v)(w,u,t,"firstMessageId",I));let C=Object(o.X)(w,u,t);const E=Object(o.db)(w,u,t);if(i&&C&&E&&Object(d.b)(C,E)&&(w=Object(r.T)(w,u,t,E),C=Object(o.X)(w,u,t),w=Object(r.v)(w,u,t,"outlyingIds",void 0),i=!1),!b){const e=i?E:C,{newViewportIds:s}=k(e,a,c);w=Object(r.x)(w,u,t,s)}Object(s.g)(w)}function k(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,r=a===l.e.Backwards?c:c+1||s,o=r-n.R,i=r+n.R-1,d=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case l.e.Backwards:b=r>0,u=o>=0;break;case l.e.Forwards:b=r0,u=d.length===n.R}return{newViewportIds:d,areSomeLocal:b,areAllLocal:u}}async function N(e){let t;const a=e.attachment?(e,n)=>{M.has(n)||(t=n,M.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;e.replyingTo&&await Object(g.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===i.MAIN_THREAD_ID||(e.replyingTo=Object(o.Bb)(n,e.chat.id,r)),await Object(j.a)("sendMessage",e,a),a&&t&&M.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=l.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:d}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,d=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Eb)(e,i,d),m=Object(o.X)(e,i,d),h=Object(o.db)(e,i,d);if(u&&u.length&&s!==l.e.Around){const a=s===l.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=k(o,a,s);if(j&&(e=Object(r.x)(e,i,d,O)),async function(e,t,a,s,n,c,r,o){t||await S(n,c,o,r,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:r,isBudgetPreload:!0}))}(t,g,n,c,b,d,s,a),c)return}else{const t=Object(o.H)(e,i)||Object(o.ib)(e,i,d),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=k(s,t,l.e.Around);O&&u.length>=n.R&&(e=Object(r.x)(e,i,d,u)),j||S(b,d,t,l.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:l}=a,b=Object(o.f)(e,n);b&&async function(e,t,a){const n=await Object(j.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===i.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.J)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.J)(c,e.id,t,n.message),c=Object(r.e)(c,Object(d.c)(n.users,"id")),Object(s.g)(c)}(b,c,l)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:c,threadId:r,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(o.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const b={...a,chat:l,replyingTo:Object(o.jb)(e,c,r),noWebPage:Object(o.bb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=b;N({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=b,c=Object(d.n)(a,n.J);for(let a=0;a0?o:void 0}),r.forEach(e=>{N({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=b;e&&N({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{N({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(j.a)("editMessage",{chat:d,message:b,text:s,entities:n}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&M.get(c.previousLocalId||c.id);r&&Object(j.b)(r),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:l,entities:d}=c,b=Object(o.f)(e,s);return n===i.MAIN_THREAD_ID&&Object(j.a)("saveDraft",{chat:b,text:l,entities:d,replyToMsgId:Object(o.jb)(e,s,n)}),Object(r.v)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const l=Object(o.f)(e,s);return c||n!==i.MAIN_THREAD_ID||Object(j.a)("clearDraft",l),Object(r.v)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.v)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(j.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(j.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.v)(t,e.id,i.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(j.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(e,r,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(j.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{const{chatId:s,maxId:n,shouldDeleteForAll:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("deleteHistory",{chat:r,shouldDeleteForAll:c,maxId:n})}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Ab)(e,n,c);if(!r)return;const{maxId:i}=a;Object(j.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(j.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(j.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("sendPollVote",{chat:r,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:o,offset:i,limit:l,shouldResetVoters:b}=a;!async function(e,t,a,n,c,o){const i=await Object(j.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.e)(l,Object(d.c)(i.users,"id"));const{voters:b}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...b,[a]:[...!o&&b&&b[a]?b[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,o,i,l,b)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(j.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(j.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(d.c)(c,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.t)(b,e.id,o,n),b=Object(r.v)(b,e.id,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(b)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.mb)(e,r.id,n);r&&i&&Object(j.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Ab)(e,s,n);c&&Object(j.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(j.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(d.c)(a,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.b)(b,e.id,o),b=Object(r.v)(b,e.id,i.MAIN_THREAD_ID,"pinnedIds",l),b=Object(r.e)(b,Object(d.c)(c,"id")),b=Object(r.c)(b,Object(d.c)(n,"id")),Object(s.g)(b)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(j.a)("fetchMessageLink",{chat:c,message:r});e&&Object(E.c)(e.link)})()});var P=a(47);const T=Object(g.g)(e=>e(),500,!1);async function A(e,t){const a=await Object(j.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.O)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(j.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.gb)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(g.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(j.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(j.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(j.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.gb)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(o.ub)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(j.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:o}=a;let i=Object(s.e)();i=Object(r.fb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.n)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(j.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.p)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(j.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(j.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(j.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.ub)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(j.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&T(()=>{!async function(e,t=0){const a=await Object(j.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:o}=n.stickers,i=a.sets.map(({id:e})=>e);o.setIds&&o.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(P.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.gb)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&T(()=>{A(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&T(()=>{A(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;T(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(j.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.hb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var R=a(28);const x=Object(g.g)(e=>e(),500,!1);async function L(e="",t,a,c,i,l){let b;if(c){const s=await Object(j.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.x,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;b={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else b=await Object(j.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.x,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!b||""!==e&&e!==m)return void Object(s.g)(Object(r.R)(u,{messages:!1}));const{messages:h,users:O,chats:g,totalCount:f,nextRate:p}=b;g.length&&(u=Object(r.c)(u,Object(d.c)(g,"id"))),O.length&&(u=Object(r.e)(u,Object(d.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.S)(u,h,f,t,p),Object(s.g)(u)}async function F(){const e=await Object(j.a)("fetchChats",{limit:n.i,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.mb)(t,Object(d.c)(e.users,"id")),t=Object(r.K)(t,Object(d.c)(e.chats,"id")),t=Object(r.q)(t,"archived",e.chatIds),t=Object(r.H)(t,"archived",e),Object(s.g)(t)}async function D(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(o.Db)(e,t)).filter(Boolean),c=await Object(j.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.mb)(e,Object(d.c)(c,"id")),Object(s.g)(e))}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:c}=e.globalSearch,{query:i}=a;i&&!c&&x(()=>{!async function(e){const t=await Object(j.a)("searchChats",{query:e,limit:n.x});let a=Object(s.e)();const c=Object(o.t)(a);if(!t||!c||e!==c)return void Object(s.g)(Object(r.R)(a,{chats:!1}));const{localChats:i,localUsers:l,globalChats:b,globalUsers:u}=t;(i.length||b.length)&&(a=Object(r.c)(a,Object(d.c)([...i,...b],"id")));(l.length||u.length)&&(a=Object(r.e)(a,Object(d.c)([...l,...u],"id")));a=Object(r.R)(a,{chats:!1}),a=Object(r.P)(a,{localResults:{chats:i,users:l},globalResults:{...a.globalSearch.globalResults,chats:b,users:u}}),Object(s.g)(a)}(i)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(R.m)(n):n,i=Object(r.P)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;L("","text",void 0,l?Object(o.f)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:r}=e.globalSearch,i=r?Object(R.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};L(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,l=Object(o.A)(e);if(!c||!l||!a)return;const{query:b,results:u}=l,m=u?u.nextOffsetId:void 0;let h;if(a!==i.MAIN_THREAD_ID){const s=Object(o.zb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.T,offsetId:i});if(!l)return;const{messages:b,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(d.c)(b,"id"),g=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.e)(f,Object(d.c)(u,"id")),f=Object(r.X)(f,e.id,t,g,m,h),Object(s.g)(f)}(c,a,h,b,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,b=i&&l&&l[i],u=b?b.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.hb,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:b,nextOffsetId:u}=c,m=Object(d.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.e)(O,Object(d.c)(l,"id")),O=Object(r.U)(O,e.id,t,h,b,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(j.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(r,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};if(!n)return;if(e.management.progress===l.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.Z)(e,l.f.InProgress),e=Object(r.Y)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(j.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.Z)(e,t?l.f.Complete:l.f.Error),e=Object(r.Y)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.Z)(e,l.f.InProgress),Object(s.g)(e),Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(j.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.Z)(e,a?l.f.Complete:l.f.Error),e=Object(r.Y)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(j.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.o&&console.log(">>> START SYNC");await Object(j.a)("fetchCurrentUser");const t=await async function(){const e=await Object(j.a)("fetchChats",{limit:n.i,withPinned:!0});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,b=[...a||[],...c||[],...l?[l]:[]],u=b.map(e=>Object(o.Db)(t,e)).filter(Boolean),h=b.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!b.includes(O)&&h.push(e),Object(m.lb)(O)){const e=Object(o.Db)(t,O);e&&!b.includes(O)&&u.push(e)}}u.push(...e.users),h.push(...e.chats),t=Object(r.r)(t,Object(d.c)(h,"id")),t=Object(r.q)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.H)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.v)(t,a,i.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.v)(t,a,i.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],c=Object(s.e)();const{chatId:l}=Object(o.y)(c)||{},b=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,i.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(l){const e=await(u=c.chats.byId[l],Object(j.a)("fetchMessages",{chat:u,threadId:i.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.R/2)+1),limit:n.R}));c=Object(s.e)();const{chatId:b}=Object(o.y)(c)||{};if(e&&b===l){const s=c.messages.byChatId[l],n=Object(d.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[l]:{byId:n,threadsById:{[i.MAIN_THREAD_ID]:{...s&&s.threadsById[i.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.K)(c,Object(d.c)(e.chats,"id")),c=Object(r.jb)(c,l,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(b).map(Number).forEach(e=>{c=Object(r.v)(c,e,i.MAIN_THREAD_ID,"draft",b[e])}),e?c=Object(r.w)(c,Object(d.c)(a,"id")):a&&(c=Object(r.mb)(c,Object(d.c)(a,"id")));Object(s.g)(c)}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.o&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.o&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([D(),F()]),await Object(j.a)("fetchCurrentUser"),n.o&&console.log(">>> FINISH AFTER-SYNC")}(t)});const B=Object(g.a)(e=>e(),500,!1,!0);function U(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(m.lb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(m.lb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Db)(e,s);if(!n)return;const{id:c,accessHash:r}=n;B(()=>Object(j.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Db)(e,n);c&&(async()=>{const t=await Object(j.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.mb)(e,Object(d.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(j.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.e)(o,Object(d.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(j.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.e)(Object(s.e)(),Object(d.c)(t.users,"id"));a=Object(r.c)(a,Object(d.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),o=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:o.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(j.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:d}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Db)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.InProgress));await Object(j.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.lb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.Z)(Object(s.e)(),l.f.Complete))}(n,c,i,d)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Db)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(j.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.bb)||c.value.match(n.cb)?t.openTelegramLink({url:c.value}):window.open(c.value);break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(j.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:r}=n;r?Object(s.d)().showError({error:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(o.r)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(o.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(j.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:d,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.InProgress}}),n&&await Object(j.a)("updateProfilePhoto",n),c||i||d){if(await Object(j.a)("updateProfile",{firstName:c,lastName:i,about:d})){e=Object(s.e)();const a=t&&Object(o.Db)(e,t);a&&Object(s.g)(Object(r.lb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:d}}))}}if(b){await Object(j.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.lb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===l.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:l.j.Idle,isUsernameAvailable:void 0}});const t=await Object(j.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(j.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:l.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(j.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==l.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(j.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.e)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.K)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(j.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(m.lb)(n)){const t=Object(o.Db)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(j.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.o)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(j.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(j.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(j.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationsSettings",()=>{(async()=>{const e=await Object(j.a)("loadNotificationsSettings");e&&Object(s.g)(Object(r.u)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,isShowPreviews:o}=a;(async()=>{await Object(j.a)("updateNotificationSettings",n,{isSilent:c,isShowPreviews:o})&&Object(s.g)(Object(r.ab)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(j.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.u)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(j.a)("fetchLanguages");e&&Object(s.g)(Object(r.u)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(j.a)("fetchPrivacySettings","phoneNumber"),Object(j.a)("fetchPrivacySettings","lastSeen"),Object(j.a)("fetchPrivacySettings","profilePhoto"),Object(j.a)("fetchPrivacySettings","forwards"),Object(j.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=U(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=U(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(j.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.u)(t,{hasPassword:e.hasPassword}),t=Object(r.kb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("checkPassword",n);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("clearPassword",n);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:o,email:i,onSuccess:l}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:o}=a;Object(s.g)(Object(r.kb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.kb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(j.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.kb)(e,{error:void 0}));var H=a(55);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.eb)(e);i&&async function(e,t,a){const n=await Object(j.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.C)(Object(s.e)(),c);o?(i=Object(r.eb)(i,o),i=Object(r.A)(i,l.i.Shipping)):i=Object(r.A)(i,l.i.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(j.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.z)(Object(s.e)(),t),n=l.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=l.i.ShippingInfo);a=Object(r.A)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(j.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.B)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(o.hb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(H.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.D)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.A)(o,l.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.eb)(e),l=Object(o.fb)(e),d=Object(o.hb)(e),b=Object(o.wb)(e);i&&d&&async function(e,t,a,n){if(await Object(j.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.g)(Object(s.e)());Object(s.g)(Object(r.h)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.A)(e,a.step||l.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.y)(e,a));a(77);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":Object(o.L)(e,a.id)||t.loadTopChats(),Object(s.g)(Object(r.F)(e,a.id,a.chat));break;case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.G)(e,n,[a.id]),e=Object(r.F)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.q)(e,t,n.filter(e=>e!==a.id))),e=Object(r.F)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.F)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.F)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.F)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const i=Object(o.f)(e,a.chatId);if(!i)return;a.chatId===c?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.F)(e,a.chatId,{unreadCount:i.unreadCount?i.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:i.unreadMentionsCount?i.unreadMentionsCount+1:1}}));break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(o.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.F)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(r.F)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.g?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,r=Object(o.j)(e,t);if(r){const{[r]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===r&&s.length>=n.I){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(r.I)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(d.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?r&&r.includes(t)?r:[...r||[],t]:r?r.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:o,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:o}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&o){const e=l.findIndex(e=>e.userId===o);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(r.F)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}}});function q(e,t,a,s,n=!1){const c=n?Object(o.mb)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(m.v)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(r.cb)(e,t,a,s):Object(r.J)(e,t,a,s)}function G(e,t){const{id:a,chatId:s}=t;e=Object(r.T)(e,s,i.MAIN_THREAD_ID,[a]),Object(o.W)(e,s,i.MAIN_THREAD_ID)&&(e=Object(r.f)(e,s,i.MAIN_THREAD_ID,a));const{threadInfo:n,firstMessageId:c}=Object(o.yb)(e,s,t)||{};return!c&&Object(m.sb)(t)||n&&(e=Object(r.T)(e,s,n.threadId,[a]),Object(o.W)(e,s,n.threadId)&&(e=Object(r.f)(e,s,n.threadId,a),c||(e=Object(r.v)(e,s,n.threadId,"firstMessageId",t.id)),n.lastMessageId||(e=Object(r.v)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id})))),e}function _(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(r.F)(e,t,{lastMessage:a})}function z(e,t){const a=Object(o.m)(e,t),s=Object(o.X)(e,t,i.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function V(e,t,a,n){if(e){t.forEach(t=>{const a=z(n=Object(r.J)(n,e,t,{isDeleting:!0}),e);a&&(n=_(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.yb)(n,e,a)||{};s&&c.push(s.threadId)}),Object(d.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.i)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=z(n=Object(r.J)(n,t,e,{isDeleting:!0}),t);a&&(n=_(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.i)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(d.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=G(e=q(e,n,c,i),i),i.threadInfo&&(e=Object(r.ib)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.yb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),i.isOutgoing||setTimeout(()=>{Object(s.g)(_(Object(s.e)(),n,l))},350)}else Object(s.g)(_(Object(s.e)(),n,l));Object(o.L)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=q(e,t,n,c,!0);const l=Object(o.lb)(e,t)||[];e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",Object(d.o)([...l,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=q(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.ib)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=_(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.mb)(e,t,n))return;e=q(e,t,n,c,!0);const l=Object.keys(Object(o.nb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=G(e,c);const i=Object(o.k)(e,t,n);e=Object(r.i)(e,t,[n]),c.isScheduled&&(e=Object(r.j)(e,t,[n])),e=Object(r.J)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=_(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,l=Object(o.lb)(e,t)||[];e=Object(r.v)(e,t,i.MAIN_THREAD_ID,"scheduledIds",[...l,c.id]);const d=Object(o.mb)(e,t,n);e=Object(r.j)(e,t,[n]),e=Object(r.cb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,l=Object(o.gb)(e,t)||[],d=n?[...l,...c]:l.filter(e=>!c.includes(e));Object(s.g)(Object(r.v)(e,t,i.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c}=a,i={...Object(o.zb)(e,t,n),...c};if(!i.threadId)return;e=Object(r.ib)(e,t,n,i),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(m.lb)(n)&&(e=Object(r.i)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;V(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(r.cb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.j)(Object(s.e)(),e,t);const a=Object(o.nb)(n,e);n=Object(r.v)(n,e,i.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a;V(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.J)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(r.J)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(r.J)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(r.J)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});var W=a(106);const $=Object(W.f)((function(){let e=Object(s.e)();Q.forEach(([t,a])=>{e=Object(r.lb)(e,t,{status:a})}),Object(s.g)(e),Q=[]}),3e3,!0);let Q=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.k)(e,a.id);case"updateUser":return Object(r.lb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,Q.push([s,n]),void $();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.lb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.fb)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(r.a)(Object(s.e)(),a.id):Object(r.o)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(r.ab)(e,a.peerType,a.isSilent,a.isShowPreviews)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var K=a(44),J=a(8),Y=a(27),Z=a(126),X=a(43),ee=a(101),te=a(67),ae=a(94),se=a(57),ne=a(33),ce=a(32),re=a(144),oe=a(128);a(186);var ie=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:r,onChange:o,onCheck:i})=>{const l=Object(c.m)(e=>{o&&o(e),i&&i(e.currentTarget.checked)},[o,i]),d=Object(J.a)("Switcher",r&&"disabled");return c.a.createElement("label",{className:d,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:r,onChange:l}),c.a.createElement("span",{className:"widget"}))});a(187);const le=[0,1,2];var de=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:r}=e.chats,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(d.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:u,currentUserId:O,globalSearchChatId:j,searchDate:g,theme:f,animationLevel:p,chatsById:I,openChat:v,openTipsChat:y,setGlobalSearchDate:w,setSettingOption:C})=>{const E=e===l.d.ChatList,M={date:void 0},S={id:void 0},k=Object(c.p)(()=>g?Object(R.a)(new Date(1e3*g)):void 0,[g]),N=Object(c.p)(()=>E&&I?Object.values(I).reduce((e,t)=>Object(m.hb)(t)&&t.unreadCount?e+1:e,0):0,[E,I]),P=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(ce.a,{round:!0,ripple:E&&!h.f,size:"smaller",color:"translucent",className:t?"active":"",onClick:E?e:()=>d(),ariaLabel:E?"Open menu":"Return to chat list"},c.a.createElement("div",{className:Object(J.a)("animated-menu-icon",!E&&"state-back")})),[E,d]),T=Object(c.m)(()=>{b||a("")},[b,a]),A=Object(c.m)(()=>{v({id:O})},[O,v]),x=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light",a="dark"===t;C({theme:t,customBackground:a?n.m:void 0,patternColor:a?n.n:n.s}),Object(te.a)(t,p>0)},[p,C,f]),L=Object(c.m)(e=>{e.stopPropagation();const t=0===p?2:0;le.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),C({animationLevel:t})},[p,C]),F=Object(ae.a)(),D=Boolean(j)||e===l.d.GlobalSearch||e===l.d.Contacts,B=e===l.d.Contacts?F("SearchFriends"):F("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(se.a,{trigger:P,footer:n.f},c.a.createElement(ne.a,{icon:"saved-messages",onClick:A},F("SavedMessages")),c.a.createElement(ne.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},F("ArchivedChats")),N>0&&c.a.createElement("div",{className:"archived-badge"},N)),c.a.createElement(ne.a,{icon:"user",onClick:r},F("Contacts")),c.a.createElement(ne.a,{icon:"settings",onClick:s},F("Settings")),c.a.createElement(ne.a,{icon:"darkmode",onClick:x},c.a.createElement("span",{className:"menu-item-name"},"Dark Mode"),c.a.createElement(ie,{id:"darkmode",label:"Toggle Dark Mode",checked:"dark"===f})),c.a.createElement(ne.a,{icon:"animations",onClick:L},c.a.createElement("span",{className:"menu-item-name capitalize"},F("Appearance.Animations").toLowerCase()),c.a.createElement(ie,{id:"animations",label:"Toggle Animations",checked:p>0})),c.a.createElement(ne.a,{icon:"help",onClick:y},"Telegram Features"),c.a.createElement(ne.a,{icon:"bug",href:n.w},"Report Bug")),c.a.createElement(re.a,{inputId:"telegram-search-input",className:j||g?"with-picker-item":"",value:t||b,focused:D,isLoading:u,placeholder:B,canClose:Boolean(j||g),onChange:a,onReset:d,onFocus:T},k&&c.a.createElement(oe.a,{icon:"calendar",title:k,canClose:!0,isMinimized:Boolean(j),className:"search-date",onClick:w,clickArg:M}),j&&c.a.createElement(oe.a,{chatOrUserId:j,onClick:i,canClose:!0,clickArg:S}))))})),be=a(20);a(188);var ue=Object(s.h)(e=>Object(d.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(ae.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState"},c.a.createElement(be.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),me=a(129),he=a(103),Oe=a(29),je=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(g.g)(e=>e(),e),[e]))(t),r=Object(Oe.a)();return Object(he.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},ge=a(158),fe=a(178);var pe=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n},lastSyncTime:c}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:c}},(e,t)=>Object(d.l)(t,["loadChatFolders"]))(({chatsById:e,usersById:t,chatFoldersById:a,orderedFolderIds:s,lastSyncTime:n,loadChatFolders:r})=>{const o=Object(c.q)(null),[i,l]=Object(c.r)(0);Object(c.n)(()=>{n&&r()},[n,r]);const b=Object(c.p)(()=>s?s.map(e=>a[e]||{}).filter(Boolean):void 0,[a,s]),u=je(()=>{if(!b||!b.length)return;const a=Object.keys(e).map(Number),s=b.map(s=>{const{unreadDialogsCount:n,hasActiveDialogs:c}=Object(m.p)(e,t,s,a)||{};return{id:s.id,badgeCount:n,isBadgeActive:c}});return Object(d.c)(s,"id")},3e3,[b,e,t]),O=Object(c.p)(()=>{if(b&&b.length)return[{title:"All"},...b.map(e=>({title:e.title,...u&&u[e.id]}))]},[b,u]),j=Object(c.m)(e=>{l(e)},[]);Object(c.n)(()=>{O&&O.length&&i>=O.length&&l(0)},[i,O]),Object(c.n)(()=>{if(o.current&&h.k&&O&&O.length)return Object(me.b)(o.current,{onSwipe:(e,t)=>{t===me.a.Left?l(Math.min(i+1,O.length-1)):t===me.a.Right&&l(Math.max(0,i-1))}})},[i,O]);const{shouldRender:g,transitionClassNames:f}=Object(Y.a)(!s,void 0,!0),p=Object(ae.a)();function I(){const e=Object.values(a).find(({title:e})=>e===O[i].title);return e&&0!==i?c.a.createElement(fe.a,{folderType:"folder",folderId:e.id,noChatsText:p("FilterNoChatsToDisplay")}):c.a.createElement(fe.a,{folderType:"all"})}return c.a.createElement("div",{className:"ChatFolders"},O&&O.length?c.a.createElement(ge.a,{tabs:O,activeTab:i,onSwitchTab:j}):g?c.a.createElement("div",{className:Object(J.a)("tabs-placeholder",f)}):void 0,c.a.createElement(ee.a,{ref:o,name:"slide",activeKey:i,renderCount:O?O.length:void 0},I))})),Ie=a(12),ve=a(17),ye=a(16);var we=e=>{const t=Object(ve.a)(Ie.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Ce=e=>{const t=Object(ve.a)(Ie.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)},Ee=a(48);a(200);let Me;var Se=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,r]=Object(c.r)(!1);Object(c.n)(()=>{e||r(!1)},[e]);const o=Object(ae.a)(),i=Object(J.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{Me&&(clearTimeout(Me),Me=void 0)},[]),d=Object(c.m)(()=>{Me&&(clearTimeout(Me),Me=void 0),Me=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(ce.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{r(!n)},ariaLabel:n?"Close":"Create new chat",tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ee.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(ne.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(ne.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(ne.a,{icon:"user",onClick:t},"New Private Chat")))});a(201);const ke=Object.keys(l.d).length/2;let Ne;var Pe=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,onSearchQuery:n,onContentChange:r,onReset:o})=>{const[i,d]=Object(c.r)(h.k),b=Object(c.q)(!1),u=Object(c.m)(()=>{r(l.d.Settings)},[r]),m=Object(c.m)(()=>{r(l.d.Contacts)},[r]),O=Object(c.m)(()=>{r(l.d.NewChannelStep1)},[r]),j=Object(c.m)(()=>{r(l.d.NewGroupStep1)},[r]),g=Object(c.m)(()=>{r(l.d.Archived)},[r]),f=Object(c.m)(()=>{e===l.d.ChatList&&(b.current=!0,d(!0))},[e]),p=Object(c.m)(()=>{b.current=!1,Ne&&(clearTimeout(Ne),Ne=void 0),Ne=window.setTimeout(()=>{b.current||d(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==l.d.ChatList?t=window.setTimeout(()=>{d(!1)},250):(b.current||h.k)&&d(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.k?void 0:f,onMouseLeave:h.k?void 0:p},c.a.createElement(de,{content:e,contactsFilter:s,onSearchQuery:n,onSelectSettings:u,onSelectContacts:m,onSelectArchived:g,onReset:o}),c.a.createElement(ue,null),c.a.createElement(ee.a,{name:"zoom-fade",renderCount:ke,activeKey:e},()=>{switch(e){case l.d.ChatList:return c.a.createElement(pe,null);case l.d.GlobalSearch:return c.a.createElement(we,{searchQuery:t,searchDate:a,onReset:o});case l.d.Contacts:return c.a.createElement(Ce,{filter:s});default:return}}),c.a.createElement(Se,{isShown:i,onNewPrivateChat:m,onNewChannel:O,onNewGroup:j}))});var Te=e=>{const t=Object(ve.a)(Ie.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Ae=e=>{const t=Object(ve.a)(Ie.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var Re,xe=e=>{const t=Object(ve.a)(Ie.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};a(202);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(Re||(Re={}));const Le=Object.keys(Re).length/2;var Fe=Object(c.h)(Object(s.h)(e=>{const{query:t,date:a}=e.globalSearch;return{searchQuery:t,searchDate:a}},(e,t)=>Object(d.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,setGlobalSearchQuery:a,setGlobalSearchChatId:s,resetChatCreation:n,setGlobalSearchDate:r,loadPasswordInfo:o,clearTwoFaError:i})=>{const[d,b]=Object(c.r)(l.d.ChatList),[u,m]=Object(c.r)(l.m.Main),[O,j]=Object(c.r)(""),[g,f]=Object(c.r)(0);let p=Re.Main;switch(d){case l.d.Archived:p=Re.Archived;break;case l.d.Settings:p=Re.Settings;break;case l.d.NewChannelStep1:case l.d.NewChannelStep2:p=Re.NewChannel;break;case l.d.NewGroupStep1:case l.d.NewGroupStep2:p=Re.NewGroup}const I=Object(c.m)(e=>{if(d!==l.d.NewGroupStep2||e){if(d===l.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(d===l.d.Settings)switch(u){case l.m.EditProfile:case l.m.Folders:case l.m.General:case l.m.Notifications:case l.m.Privacy:case l.m.Language:return void m(l.m.Main);case l.m.GeneralChatBackground:return void m(l.m.General);case l.m.GeneralChatBackgroundColor:return void m(l.m.GeneralChatBackground);case l.m.PrivacyPhoneNumber:case l.m.PrivacyLastSeen:case l.m.PrivacyProfilePhoto:case l.m.PrivacyForwarding:case l.m.PrivacyGroupChats:case l.m.PrivacyActiveSessions:case l.m.PrivacyBlockedUsers:case l.m.TwoFaDisabled:case l.m.TwoFaEnabled:case l.m.TwoFaCongratulations:return void m(l.m.Privacy);case l.m.PrivacyPhoneNumberAllowedContacts:case l.m.PrivacyPhoneNumberDeniedContacts:return void m(l.m.PrivacyPhoneNumber);case l.m.PrivacyLastSeenAllowedContacts:case l.m.PrivacyLastSeenDeniedContacts:return void m(l.m.PrivacyLastSeen);case l.m.PrivacyProfilePhotoAllowedContacts:case l.m.PrivacyProfilePhotoDeniedContacts:return void m(l.m.PrivacyProfilePhoto);case l.m.PrivacyForwardingAllowedContacts:case l.m.PrivacyForwardingDeniedContacts:return void m(l.m.PrivacyForwarding);case l.m.PrivacyGroupChatsAllowedContacts:case l.m.PrivacyGroupChatsDeniedContacts:return void m(l.m.PrivacyGroupChats);case l.m.TwoFaNewPassword:return void m(l.m.TwoFaDisabled);case l.m.TwoFaNewPasswordConfirm:return void m(l.m.TwoFaNewPassword);case l.m.TwoFaNewPasswordHint:return void m(l.m.TwoFaNewPasswordConfirm);case l.m.TwoFaNewPasswordEmail:return void m(l.m.TwoFaNewPasswordHint);case l.m.TwoFaNewPasswordEmailCode:return void m(l.m.TwoFaNewPasswordEmail);case l.m.TwoFaChangePasswordCurrent:case l.m.TwoFaTurnOff:case l.m.TwoFaRecoveryEmailCurrentPassword:return void m(l.m.TwoFaEnabled);case l.m.TwoFaChangePasswordNew:return void m(l.m.TwoFaChangePasswordCurrent);case l.m.TwoFaChangePasswordConfirm:return void m(l.m.TwoFaChangePasswordNew);case l.m.TwoFaChangePasswordHint:return void m(l.m.TwoFaChangePasswordConfirm);case l.m.TwoFaRecoveryEmail:return void m(l.m.TwoFaRecoveryEmailCurrentPassword);case l.m.TwoFaRecoveryEmailCode:return void m(l.m.TwoFaRecoveryEmail);case l.m.FoldersCreateFolder:case l.m.FoldersEditFolder:return void m(l.m.Folders)}b(l.d.ChatList),j(""),a({query:""}),r({date:void 0}),s({id:void 0}),n(),setTimeout(()=>{f(Date.now())},250)}else b(l.d.NewGroupStep1)},[d,a,s,r,n,u]),v=Object(c.m)(t=>{d!==l.d.Contacts?(b(l.d.GlobalSearch),t!==e&&a({query:t})):j(t)},[d,a,e]);return Object(c.n)(()=>d!==l.d.ChatList?Object(X.a)(()=>I()):void 0,[d,I]),Object(c.n)(()=>{i(),u===l.m.Privacy&&o()},[i,o,u]),c.a.createElement(ee.a,{id:"LeftColumn",name:h.f?"slide-layers":"push-slide",renderCount:Le,activeKey:p},()=>{switch(p){case Re.Archived:return c.a.createElement(xe,{onReset:I});case Re.Settings:return c.a.createElement(Te,{currentScreen:u,onScreenSelect:m,onReset:I});case Re.NewChannel:return c.a.createElement(Ae,{key:g,isChannel:!0,content:d,onContentChange:b,onReset:I});case Re.NewGroup:return c.a.createElement(Ae,{key:g,content:d,onContentChange:b,onReset:I});default:return c.a.createElement(Pe,{content:d,searchQuery:e,searchDate:t,contactsFilter:O,onContentChange:b,onSearchQuery:v,onReset:I})}})})),De=a(125),Be=a(13),Ue=a(50);var He=()=>{const[e,t]=Object(c.r)(Ue.a.get());return Object(c.n)(()=>{const e=Object(g.g)(()=>{t(Ue.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),e},qe=a(38);function Ge(e,t){const a=Object(qe.a)(e,!0),s=Object(c.q)(),n=Object(Oe.a)(),r=null!=e;return r&&s.current&&(clearTimeout(s.current),s.current=void 0),Object(he.a)(()=>{t&&!r&&a&&!s.current&&(s.current=window.setTimeout(()=>{s.current=void 0,n()},t))},[e]),s.current&&t&&!r?a:e}function _e(e,t){const a=e<=n.Z?16:32,s=function(e){if(e>n.W){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.V){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.Z?54:64,r=t?s-a-c:s-a,o=e>n.Z?Math.min(s-a,512):s-a,i=o/r,l=r/o;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:o/258,toolbarForUnpinHiddenScale:258/o}}var ze=a(134),Ve=a(131);function We(e,t=!1,a=!1){const s=Object(qe.a)(e,t);return a||null!=e?e:s}var $e=a(46),Qe=a(97),Ke=a(112);var Je=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0};var Ye=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(m.jb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.O)(e,t),l="thread"===s&&a===i.MAIN_THREAD_ID,d="thread"===s&&a!==i.MAIN_THREAD_ID,b=Object(o.V)(e),u=Boolean(Object(o.K)(e,t)),O=Boolean(l&&n&&(c||Object(m.nb)(n))&&n.isNotJoined),j=l||d,g=l&&!r&&!O,f=!Object(o.R)(e),p=l&&!O;return{noMenu:!(h.f&&O||h.f&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:O,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(d.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:O})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),w=Object(c.m)(()=>{I(void 0)},[]),C=Object(c.m)(()=>{u({chatId:e})},[u,e]),E=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(O(),h.f){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[O]),S=Object(ae.a)();return c.a.createElement("div",{className:"HeaderActions"},!h.f&&r&&c.a.createElement(ce.a,{size:"tiny",ripple:!0,fluid:!0,onClick:C},S(s?"Subscribe":"Join Group")),!h.f&&n&&c.a.createElement(ce.a,{size:"tiny",ripple:!0,fluid:!0,onClick:E},S("Start")),!h.f&&o&&c.a.createElement(ce.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(h.f||!r)&&c.a.createElement(ce.a,{ref:j,className:g?"active":"",round:!0,ripple:!h.f,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(Je,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:C,onSearchClick:M,onClose:y,onCloseAnimationEnd:w}))})),Ze=a(105),Xe=a(36),et=a(98),tt=a(35);function at(e){const t=e&&Object(m.E)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(h.o)()&&t.includes("image/webp"),[r,o]=Object(c.r)(tt.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(tt.c)("b64-"+i,t).then(o).catch(e=>{n.o&&console.error(e)})},[i,s,t]),s?r:t}var st=a(108),nt=a(34),ct=a(37);function rt(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var ot=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),r="clipPath"+e,o=function(e,t,a){let s="";if(3===a)s=rt(0,0,2,t,1)+rt(0,12,2,t+1,1)+rt(0,25,2,t,1);else for(let e=0;e\n \n `}(r,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:o,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:r}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:r,clipPath:o}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${o} `),u&&(u.innerHTML=o),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:r,markHeight:o,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(J.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${r}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${o}px; transform: translateY(${i}px);`})))});var it=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=at(e),d=Object(et.a)(Object(m.D)(e,"pictogram")),b=Object(m.M)(e,Boolean(l)),[u,h,O]=Object(ct.a)(),j=Object(c.m)(()=>{O(),r&&r(e.id)},[O,r,e.id]),g=Object(ae.a)();return c.a.createElement("div",{className:Object(J.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:g("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:g("UnpinMessageAlertTitle"),className:"unpin-button",onClick:h},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(st.a,{isOpen:u,onClose:O,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:j}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o},c.a.createElement(ot,{count:t,index:a}),l&&function(e,t){const{width:a,height:s}=Object(Ze.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(l,d),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title"},s||`${g("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",null,Object(Xe.a)(b))),c.a.createElement(nt.a,null)))}),lt=a(49),dt=a(166);a(205);var bt=Object(s.h)((e,{message:t})=>{const a=Object(o.qb)(e,t);return{senderName:a?Object(m.U)(a):void 0}},(e,t)=>Object(d.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,senderName:s,focusMessage:n,closeAudioPlayer:r})=>{const o=lt.c(Object(m.D)(e,"inline")),{playPause:i,isPlaying:l}=Object(dt.a)(Object(m.A)(e),Object(m.r)(e),o,void 0,void 0,!0),d=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),b=Object(c.m)(()=>{l&&i(),r()},[r,l,i]),u=Object(ae.a)();if(a)return;const O=Object(m.u)(e);return c.a.createElement("div",{className:Object(J.a)("AudioPlayer",t)},c.a.createElement(ce.a,{round:!0,ripple:!h.f,color:"translucent",size:"smaller",className:Object(J.a)("toggle-play",l?"pause":"play"),onClick:i,ariaLabel:l?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:d},O?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title"},Object(Xe.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle"},Object(Xe.a)(a)))}(O):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title"},t&&Object(Xe.a)(t)),c.a.createElement("div",{className:"subtitle"},e))}(u("AttachAudio"),s),c.a.createElement(nt.a,null)),c.a.createElement(ce.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:b,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(206);var ut=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,l=Object(o.f)(e,t),{typingStatus:d}=l||{},{chatId:b,messageId:u}=e.audioPlayer,h=b&&u?Object(o.k)(e,b,u):void 0,O=Object(o.Ab)(e,t,a);let j;if("pinned"===s){const a=Object(o.gb)(e,t);j=a&&a.length}else if("scheduled"===s){const a=Object(o.lb)(e,t);j=a&&a.length}else if("thread"===s&&a!==i.MAIN_THREAD_ID){const s=Object(o.zb)(e,t,a);s&&(j=s.messagesCount)}let g={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),audioMessage:h,chatTitleLength:l&&Object(m.l)(l).length,chatsById:r,originChatId:O?O.id:t,messagesCount:j,isChatWithSelf:Object(o.O)(e,t),isChatWithBot:l&&Object(o.N)(e,l),lastSyncTime:c};const f=Object(o.m)(e,t);if("thread"===s&&f)if(a===i.MAIN_THREAD_ID){const s=Object(o.gb)(e,t);if(s&&s.length){const t=f[s[0]],{canUnpin:n}=t&&Object(o.b)(e,t,a)||{};g={...g,pinnedMessageIds:s,messagesById:f,canUnpin:n}}}else{const s=Object(o.Bb)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.J)(e,n):void 0,r=c?Object(m.U)(c):void 0;g={...g,pinnedMessageIds:s,messagesById:f,canUnpin:!1,topMessageTitle:r}}return g},(e,t)=>Object(d.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageTitle:l,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:O,audioMessage:j,chatTitleLength:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:w,openChatWithInfo:C,pinMessage:E,focusMessage:M,openChat:S,loadPinnedMessages:k,toggleLeftColumn:N,exitMessageSelectMode:P})=>{const[T,A]=Object(c.r)(0),R=Array.isArray(s)?s[T]:s,x=r&&R?r[R]:void 0,L=Array.isArray(s)?s.length:s?1:0;Object(c.n)(()=>{t===i.MAIN_THREAD_ID&&w&&k({chatId:e})},[e,k,w,t]),Object(c.n)(()=>{A(0)},[e]),Object(c.n)(()=>{A(L?Object(ze.a)(L,T):-1)},[L,T]),Object(Ve.a)(e,R,x);const{width:F}=He(),D=F<=n.V,B=F>=n.Z&&u,U=Object(c.q)(null),H=Object(c.q)(!0),q=Object(c.m)(()=>{C({id:e})},[C,e]),G=Object(c.m)(t=>{E({chatId:e,messageId:t,isUnpin:!0})},[E,e]),_=Object(c.m)(()=>{if(x){M({chatId:x.chatId,threadId:t,messageId:x.id});const e=Object(ze.a)(L,T+1);A(e)}},[x,M,t,L,T]),z=Object(c.m)(()=>{S({id:e,threadId:i.MAIN_THREAD_ID,type:"pinned"})},[S,e]),V=Object(c.m)(()=>{if(h.f){const e=document.getElementById(n.u);e&&e.blur()}t!==i.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&P(),S({id:p,threadId:i.MAIN_THREAD_ID})):h.f?S({id:void 0}):N()},[S,p,t,a,N,b,P]),W=Object(c.p)(()=>{if(!D||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(m.hb)(a))return t;const s=a.unreadCount||0;return!s||a.isMuted&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[D,f]),$=F>=n.V&&Fn.Z&&F30),Q=$||F>n.W&&F{const e=U.current;if(e)return Q&&oe?void(O||$?(H.current&&(e.classList.add("tools-stacked","animated"),H.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),H.current=!0)):(e.classList.remove("tools-stacked","animated"),void(H.current=!0))},[Q,oe,$,O]);const ie=Object(ae.a)();function le(){return"thread"===a&&t===i.MAIN_THREAD_ID?c.a.createElement(c.a.Fragment,null,D&&de(B,W),c.a.createElement("div",{className:"chat-info-wrapper",onClick:q},Object(m.lb)(e)?c.a.createElement(Qe.a,{userId:e,typingStatus:d,withFullInfo:y,withMediaViewer:!0,withUpdatingStatus:!0}):c.a.createElement(Ke.a,{chatId:e,typingStatus:d,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,ie("CommentsCount",I))):"pinned"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,ie("PinnedMessagesCount",I))):"scheduled"===a?c.a.createElement(c.a.Fragment,null,de(),c.a.createElement("h3",null,v?ie("Reminders"):ie("messages",I))):void 0}function de(e=!1,t){return c.a.createElement("div",{className:"back-button"},c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",onClick:V,ariaLabel:e?"Close":"Back"},c.a.createElement("div",{className:Object(J.a)("animated-close-icon",!e&&"state-back")})),t&&c.a.createElement("div",{className:"unread-count "+(t.isActive?"active":"")},Object($e.b)(t.totalCount)))}return c.a.createElement("div",{className:"MiddleHeader",ref:U},c.a.createElement(ee.a,{name:"slide-fade",activeKey:"thread"===a?t:1},le),c.a.createElement("div",{className:"header-tools"},te&&ne&&!K&&c.a.createElement(it,{key:e,message:ne,count:L,index:T,customTitle:re,className:se,onUnpinMessage:o?G:void 0,onClick:_,onAllPinnedClick:z}),K&&X&&c.a.createElement(bt,{key:Object(m.A)(X),message:X,className:Z}),c.a.createElement(Ye,{chatId:e,threadId:t,messageListType:a})))})),mt=a(151);function ht(e){return"albumId"in e}function Ot(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(R.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((r,o)=>{r.isInAlbum?a?(a.messages.push(r),r.content.text&&(a.mainMessage=r)):a={albumId:r.groupedId,messages:[r],mainMessage:r}:s.push(r);const i=e[o+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(R.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||r.senderId!==i.senderId||r.isOutgoing!==i.isOutgoing||Object(m.db)(r)||Object(m.db)(i)||r.forwardInfo&&i.forwardInfo&&(r.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||r.inlineButtons||i.inlineButtons)&&(s=[],n.senderGroups.push(s))}}),c}var jt=a(96);function gt(){const[e,t]=Object(ct.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(g.a)(e=>e(),s,n,r),[s,n,r]));var s,n,r;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(g.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(g.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var ft=a(146),pt=a(116);let It=!1;var vt=({containerRef:e,className:t,messageIds:a,containerHeight:s,listItemElementsRef:r,focusingId:o,anchorIdRef:i,anchorTopRef:l,loadMoreForwards:d,loadMoreBackwards:b,isViewportNewest:u,firstUnreadId:m,onFabToggle:h,children:O})=>{const j=Object(c.q)(null),g=Object(c.q)(null),f=Object(c.q)(null),p=Object(c.m)(()=>{if(It)return;if(!a||!a.length)return void h(!1);if(!u)return void h(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t;h(m?!(0===c):!(c<=50))},[a,u,e,h,m]),{observe:I,freeze:v,unfreeze:y}=Object(jt.a)({rootRef:e,margin:n.Q},t=>{if(!d||!b)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(ft.a)(e.current),b()):"forwards-trigger"===s.className&&s.dataset.isActive&&(Object(ft.a)(e.current),d())});Object(jt.c)(j,I),Object(jt.c)(g,I);const{observe:w,freeze:C,unfreeze:E}=Object(jt.a)({rootRef:e,margin:50},([{target:e}])=>{e.dataset.isActive&&p()});return Object(jt.c)(f,w),Object(he.a)(()=>{o?(v(),C()):(E(),y())},[o]),Object(he.a)(()=>{if(!r.current)return;const e=r.current.filter(e=>a.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(i.current=t.id,l.current=t.getBoundingClientRect().top)},[a,s]),Object(he.a)(()=>{It=!0,setTimeout(()=>{It=!1},100)},[a]),Object(c.n)(p,[m]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:j,key:"backwards-trigger",className:"backwards-trigger"}),O,c.a.createElement("div",{ref:g,key:"forwards-trigger",className:"forwards-trigger","data-is-active":!u}),c.a.createElement("div",{ref:f,key:"fab-trigger",className:"fab-trigger","data-is-active":u}))},yt=a(133),wt=a(136);function Ct(e){return"number"==typeof e}function Et(e){return e?175:100}function Mt(e){const t=Object(m.tb)(e),a=Object(m.qb)(e),s=Object(m.G)(e)||Object(m.Q)(e),n=Object(m.O)(e),c=Boolean(Object(m.Q)(e)),{width:r,height:o}=s?Object(Ze.f)(s,t,a,c):Object(Ze.h)(n,t,a),i=Et(Boolean(Object(m.N)(e)));let l=1;re+t,t)}function Rt(e,t,a){return ea?a:e}function xt(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&Nt&&(t.width=e.width+e.x),a&Pt&&(t.height=e.height+e.y)}),t}function Lt(e,t,a,s){const c=a.messages.map(e=>{const t=Mt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.Z?a/100*69-(t?1.625:0)*Ze.c:((e?30:29)-(t?1.625:0))*Ze.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const r=function(e,t){return e.map(e=>t>1.1?Rt(e,1,2.75):Rt(e,.6667,1))}(e,t),o=e.length,i=new Array(o),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=At(r.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==o;++e){const t=o-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==o-1;++e)for(let a=1;a!==o-e;++a){const s=o-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==o-1;++e)for(let t=1;t!==o-e;++t)for(let a=1;a!==o-e-t;++a){const s=o-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==r;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(o-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:Tt|kt|Nt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:Tt|Pt|Nt}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,r=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:r},sides:kt|Tt|Pt},{dimensions:{x:c+s,y:0,width:c,height:r},sides:kt|Nt|Pt}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,r=Math.round(1.5*a),o=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-r),i=s-o-n,l=Math.min(c,Math.round(Math.min(i/t[0],o/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:kt|Tt|Pt},{dimensions:{x:i+n,y:0,width:o,height:l},sides:kt|Nt|Pt}]}(e)}(u):3===i?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,r=t,o=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=r-o-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(o*s[2],i*s[1])))),d=Math.min(Math.round(r*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:kt|Tt|Pt},{dimensions:{x:d+a,y:0,width:l,height:i},sides:kt|Nt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:Pt|Nt}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,r=Math.round(Math.min(c/a[0],.66*(s-n))),o=(t-n)/2,i=Math.min(s-r-n,Math.round(Math.min(o/a[1],o/a[2])));return[{dimensions:{x:0,y:0,width:c,height:r},sides:Tt|kt|Nt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:Pt|Tt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:Pt|Nt}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,r=Math.round(Math.min(c/t[0],.66*(s-a))),o=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),o*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),o*t[3])),d=c-i-l-2*a,b=Math.min(s-r-a,o);return[{dimensions:{x:0,y:0,width:c,height:r},sides:Tt|kt|Nt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:Pt|Tt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:Pt},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:Nt|Pt}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,r=Math.round(Math.min(c*t[0],.6*(a-s))),o=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(o/t[1]),l=Math.round(o/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-r-s,o));return[{dimensions:{x:0,y:0,width:r,height:c},sides:kt|Tt|Pt},{dimensions:{x:r+s,y:0,width:b,height:i},sides:kt|Nt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:Nt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:Pt|Nt}]}(e)}(u),{layout:b,containerStyle:xt(b)}}let Ft;function Dt(e){return Ft||(Ft=document.createElement("span"),Ft.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Ft.style.whiteSpace="nowrap",Ft.style.position="absolute",Ft.style.left="-999px",Ft.style.opacity=".01",document.body.appendChild(Ft)),Ft.innerHTML=e,Ft.offsetWidth}function Bt(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(pt.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var Ut=a(100),Ht=a(179);var qt=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0};var Gt=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.T)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(m.jb)(b)||a===t.chatId)?b:a?Object(o.Db)(e,a):void 0,...s&&{targetUser:Object(o.Db)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,sender:n,targetUser:r,targetMessage:o,targetChatId:i,isFocused:l,focusDirection:d,noFocusHighlight:b})=>{const u=Object(c.q)(null);Object(jt.c)(u,t),Object(Ve.a)(e.chatId,e.replyToMessageId,o),Bt(u,e.chatId,l,d,b),Object(ae.a)();const m=s<=0,[h,O]=Object(ct.a)(m);Object(c.n)(()=>{m||setTimeout(O,10*s)},[s,O,m]);const{transitionClassNames:j}=Object(Y.a)(h,void 0,m,!1),g=Object(Ht.a)(e,n,r,o,i,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:f,contextMenuPosition:p,handleBeforeContextMenu:I,handleContextMenu:v,handleContextMenuClose:y,handleContextMenuHide:w}=Object(yt.a)(u),C=void 0!==p;return a?c.a.createElement("span",{className:"embedded-action-message"},Object(Xe.a)(g)):c.a.createElement("div",{ref:u,id:"message"+e.id,className:Object(J.a)("ActionMessage message-list-item",l&&!b&&"focused",C&&"has-menu-open",j),"data-message-id":e.id,onMouseDown:I,onContextMenu:v},c.a.createElement("span",null,g),p&&c.a.createElement(qt,{isOpen:f,anchor:p,message:e,messageListType:"thread",onClose:y,onCloseAnimationEnd:w}))}));a(207);var _t=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(jt.b)(i,r),d=Object(et.a)(t&&Object(m.D)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=at(t);Object(ae.a)();const h=a&&Object(m.U)(a);return c.a.createElement("div",{ref:i,className:Object(J.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a){const{width:s,height:n}=Object(Ze.k)();return c.a.createElement("img",{id:e,src:a||t,width:s,height:n,alt:""})}(b,u,d),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"message-title"},Object(Xe.a)(h||s||" ")),c.a.createElement("p",null,t?Object(m.db)(t)?c.a.createElement(Gt,{message:t,isEmbedded:!0}):Object(Xe.a)(Object(m.M)(t,Boolean(u))):n||" ")))},zt=a(152),Vt=a(157),Wt=a(163);a(211);var $t=({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(ae.a)();return c.a.createElement("span",{className:"MessageMeta",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object($e.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(Xe.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(R.h)(1e3*e.date)),t&&c.a.createElement(Wt.a,{status:t}))},Qt=a(104),Kt=a(107),Jt=a(153);a(212);var Yt=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(ct.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:h}=b,O=h===n.O,j=Object(jt.b)(o,t),g=Object(jt.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(m.D)(e,"inline"),p=at(e),I=Object(et.a)(f,!j,Object(m.C)(e,"inline",!0),r),v=Boolean(I),[y,w]=Object(ct.a)(v),C=u?y:v,{shouldRenderFullMedia:E,transitionClassNames:M}=Object(Qt.a)(C,"slow"),{width:S,height:k}=Object(Ze.l)(b),N=Object(J.a)("thumbnail",!p&&"empty"),P=Object(J.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!C&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&E&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(J.a)("full-media",M)}),u&&v&&c.a.createElement(Kt.a,{key:f,className:Object(J.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:w}),c.a.createElement(Jt.a,{isOpen:i,fromSticker:b,onClose:d}))},Zt=a(120),Xt=a(113),ea=a(137);function ta(e,t){return Object(ea.a)(Object(m.E)(e),Boolean(t),h.f?n.G:void 0)}var aa=async(e,t,a,s)=>s?"rgba(255,255,255,1)":async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,r=a.height-1;return`rgba(${Array.from(n.getImageData(c,r,1,1).data).join(",")})`}(e,t);var sa=a(114);var na=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,shouldAffectAppendix:d,onClick:b,onCancelUpload:u})=>{const h=Object(c.q)(null),O=(Object(m.G)(t)||Object(m.Q)(t)).blobUrl,j=Object(jt.b)(h,a),[g,f]=Object(c.r)(s),p=g&&j,{mediaData:I,downloadProgress:v}=Object(Xt.a)(Object(m.D)(t,i),!p),y=O||I,w=ta(t,y),{isUploading:C,isTransferring:E,transferProgress:M}=Object(m.s)(t,o||v,p&&!y),S=!1===Object(qe.a)(g),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(E,void 0,S,"slow"),{shouldRenderThumb:P,shouldRenderFullMedia:T,transitionClassNames:A}=Object(Qt.a)(y,"slow"),R=Object(c.m)(()=>{C?u&&u(t):y?b&&b(t.id):f(e=>!e)},[y,C,t,u,b]),x=Object(m.tb)(t);Object(c.o)(()=>{if(!d)return;const e=h.current.closest(".message-content");y?aa(y,x,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[y,x,d,n,r]);const{width:L,height:F,isSmall:D}=l||Mt(t),B=Object(J.a)("media-inner",!C&&"interactive",D&&"small-image",L===F&&"square-image"),U=Object(J.a)("thumbnail",!w&&"empty"),H=l?`width: ${L}px; height: ${F}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:h,className:B,style:H,onClick:C?void 0:R},P&&c.a.createElement("img",{src:w,className:U,width:L,height:F,alt:""}),T&&c.a.createElement("img",{src:y,className:"full-media "+A,width:L,height:F,alt:""}),k&&c.a.createElement("div",{className:"media-loading "+N},c.a.createElement(sa.a,{progress:M,onClick:C?R:void 0})),!y&&!g&&c.a.createElement("i",{className:"icon-download"}),E&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*M),"%"))},ca=a(122),ra=a(135);function oa(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(ra.a)(e.current)},[e]);Object(K.a)(s,n)}var ia=a(138);function la(){return(la=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),h=t.content.video,O=h.blobUrl,j=Boolean(O)||Object(m.b)(h),g=Object(jt.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),w=Object(et.a)(Object(m.D)(t,"pictogram"),!(g&&o),Object(m.C)(t,"pictogram"),o),C=ta(t,w),{mediaData:E,downloadProgress:M}=Object(Xt.a)(Object(m.D)(t,"inline"),!I,Object(m.C)(t,"inline"),o),S=w||C,k=O||E,N=Boolean(j&&g&&k),{isBuffered:P,bufferingHandlers:T}=Object(ca.a)(!s),{isUploading:A,isTransferring:x,transferProgress:L}=Object(m.s)(t,r||M,I&&j&&!P),F=!1===Object(qe.a)(f),{shouldRender:D,transitionClassNames:B}=Object(Y.a)(x,void 0,F),{shouldRenderThumb:U,transitionClassNames:H}=Object(Qt.a)(k,"slow"),[q,G]=Object(c.r)(0),_=Object(c.m)(e=>{G(Math.max(0,e.currentTarget.currentTime-1))},[]),z=Object(m.tb)(t),V=Object(m.qb)(t),{width:W,height:$}=i||Object(Ze.h)(h,z,V);oa(u,N),Object(ia.a)(u,[N]);const Q=Object(c.m)(()=>{A?d&&d(t):j&&!k?p(e=>!e):j&&k&&!v?(y(!0),u.current.play()):l&&l(t.id)},[A,j,k,v,l,d,t]),K=Object(J.a)("media-inner dark",!A&&"interactive"),Z=Object(J.a)("thumbnail",!S&&"empty"),X=Object(J.a)("full-media",H),ee=S?`background-image: url(${S}); background-size: cover`:"",te=i?`width: ${W}px; height: ${$}px; left: ${i.x}px; top: ${i.y}px;`:"",ae=N,se=!j&&E,ne=!j||f&&!v&&!D,ce=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:K,style:te,onClick:A?void 0:Q},(U||!N)&&c.a.createElement("img",{src:S,className:Z,width:W,height:$,alt:""}),ae&&c.a.createElement("video",la({ref:u,className:X,width:W,height:$,autoPlay:v,muted:!0,loop:!0,playsInline:!0,style:ee},T,{onTimeUpdate:_}),c.a.createElement("source",{src:k})),se&&c.a.createElement("img",{src:E,className:"full-media "+H,width:W,height:$,alt:""}),ne&&c.a.createElement("i",{className:"icon-large-play"}),D&&c.a.createElement("div",{className:"media-loading "+B},c.a.createElement(sa.a,{progress:L,onClick:A?Q:void 0})),ce&&c.a.createElement("i",{className:"icon-download"}),x&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*L),"%"):x&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},h.isGif?"GIF":Object(R.e)(h.duration-q)))},ba=a(19);a(214);var ua=Object(s.h)((e,{contact:t})=>({user:Object(o.Db)(e,t.userId)}),(e,t)=>Object(d.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:r,userId:o}=e,i=Object(c.m)(()=>{a({id:o})},[a,o]);return c.a.createElement("div",{className:Object(J.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(Ut.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(ba.c)(r))))}),ma=a(41);var ha=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:r,onChange:o})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),o(s)},[o,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(ma.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:r?-1!==r.indexOf(e.value):void 0,onChange:d})))}),Oa=a(118),ja=a(171);a(217);function ga(e,t){return t>0?(e/t*100).toFixed():0}var fa=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:r})=>{const o=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||o&&o.isChosen,d=o?ga(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?ga(o.votersCount,s||0):0,O=b{r&&u(d)},[r,d]),Object(c.n)(()=>{const e=m.current;if(e&&r){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,r]),!t||!o)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(J.a)("poll-option-chosen",!i&&"wrong",r&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text"},Object(Xe.a)(e.text)),c.a.createElement("div",{className:Object(J.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(218);var pa=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(d.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:w,totalVoters:C}=b,E=w&&w.some(e=>e.isChosen),M=!d.closed&&!E,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=w?Math.max(...w.map(e=>e.votersCount)):C,P=w?w.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(R.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(R.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||E&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,E,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),x=Object(c.m)(e=>{O([e]),m(!0),p(!0),r([e])},[r]),L=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&E&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[E,f,b.results,d.quiz,t.results.solution]);const H=Object(ae.a)();return c.a.createElement("div",{className:"Poll"},j&&t.results.solution&&c.a.createElement(ja.a,{message:Object(wt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U}),c.a.createElement("div",{className:"poll-question"},Object(Xe.a)(d.question)),c.a.createElement("div",{className:"poll-type"},function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"Quiz":"Anonymous Quiz";if(e.closed)return"Final results";return e.isPublic?"Poll":"Anonymous Poll"}(d),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(Ut.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(ce.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(ha,{options:T,onChange:L,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(Oa.a,{name:"poll-"+i,options:T,onChange:x,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(fa,{key:e.option,shouldAnimate:f,answer:e,voteResults:w,totalVoters:C,maxVotersCount:N,correctResults:P})}))),!S&&!k&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t){if(!t)return e?"No answers yet":"No voters yet";return e?t+" answered":t+" voted"}(d.quiz,b.totalVoters)),k&&c.a.createElement(ce.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(ce.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ia=a(147),va=a(52);a(219);var ya=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(m.P)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=Mt(e);i=t===a}const l=Object(c.m)(()=>{o&&(i||o.hasDocument)?window.open(o.url):n&&n()},[o,i,n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:h,description:O,photo:j}=o,g=Object(Ia.a)(O,170),f=["WebPage",j?i&&"with-square-photo":!s&&"without-photo"].filter(Boolean).join(" ");return c.a.createElement("div",{className:f,"data-initial":(d||u)[0]},j&&c.a.createElement(na,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",onClick:l,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(va.a,{className:"site-name",url:b,text:d||u}),h&&c.a.createElement("p",{className:"site-title"},Object(Xe.a)(h)),g&&c.a.createElement("p",{className:"site-description"},Object(Xe.a)(g,["emoji","br"]))))});a(220);var wa=Object(c.h)(({message:e})=>{const t=Object(m.z)(e),{title:a,text:s,description:n,photoUrl:r}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(Xe.a)(a)),s&&c.a.createElement("p",null,Object(Xe.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(r?"has-image":"")},r&&c.a.createElement("img",{className:"invoice-image",src:r,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(Xe.a)(n,["emoji","br"]))))});function Ca(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.R)(e),isSelected:Object(o.U)(e,a.id)}},(e,t)=>Object(d.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:r,dimensions:o}=t,i=Object(c.m)(e=>{e.stopPropagation(),r({messageId:n.id,withShift:e&&e.shiftKey})},[r,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(J.a)("album-item-select-wrapper",s&&"is-selected"),style:o?`left: ${o.x}px; top: ${o.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(221);const Ea=Ca(na),Ma=Ca(da);var Sa=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(d.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,h=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,b){const{photo:O,video:j}=Object(m.v)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&Tt&&I&Pt));return c.a.createElement(Ea,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:h})}if(j)return c.a.createElement(Ma,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:h})})))});a(222);function ka(){return(ka=Object.assign||function(e){for(var t=1;t{const r=Object(c.q)(null),o=Object(c.q)(null),i=Object(c.q)(null),l=e.content.video,d=Object(jt.b)(r,t),[b,u]=Object(c.r)(a&&s),h=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(Xt.a)(Object(m.D)(e,"inline"),!h,Object(m.C)(e,"inline"),n),g=ta(e,O),{isBuffered:f,bufferingHandlers:p}=Object(ca.a)(),I=b&&!f,v=!1===Object(qe.a)(b),{shouldRender:y,transitionClassNames:w}=Object(Y.a)(I||!f,void 0,v),{shouldRenderThumb:C,transitionClassNames:E}=Object(Qt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(ra.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(x=T,()=>{Na&&Na(),Na=x});var x;Object(c.n)(()=>{i.current&&(P?Object(ra.a)(i.current):i.current.pause())},[P]),oa(i,P),Object(ia.a)(i,[O]);const L=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(ra.a)(e):e.pause():(e.currentTime=0,S(!0),A())},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(J.a)("full-media",E);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:L},C&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("img",{src:g,className:"thumbnail",width:Ze.d,height:Ze.d,alt:""})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",ka({ref:i,className:D,width:Ze.d,height:Ze.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,poster:g,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+w},c.a.createElement(sa.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(R.e)(i.current.currentTime):Object(R.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(223);var Ta=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(ce.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text)))));a(224);var Aa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.zb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(d.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const{threadId:r,chatId:o,messagesCount:i,lastMessageId:l,lastReadInboxMessageId:d,recentReplierIds:b}=t,u=Object(c.m)(()=>{n({id:o,threadId:r})},[n,o,r]);if(void 0===i)return;const h=b&&b.map(e=>Object(m.lb)(e)?a[e]:s[e]).filter(Boolean);const O=Boolean(d&&l&&d0&&c.a.createElement("div",{className:"recent-repliers"},h.map(e=>c.a.createElement(Ut.a,{key:e.id,size:"small",user:Object(m.lb)(e.id)?e:void 0,chat:Object(m.lb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label"},function(e){if(0===e)return"Leave a Comment";if(1===e)return"1 Comment";return Object($e.a)(e)+" Comments"}(i)),c.a.createElement("i",{className:"icon-next"}))}));a(225);function Ra(e){const t=La(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function xa(e){const t=La(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function La(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Fa=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,h),p=Object(o.O)(e,h),I=f&&Object(m.jb)(f),v=!p&&Object(m.eb)(c),y=i||l||v?Object(o.qb)(e,c):void 0,w=Object(o.J)(e,c),C=O?Object(o.Db)(e,O):void 0,E=d?Object(o.Bb)(e,h,d):void 0,M=c.id===E,S=j===E,k=j&&!S?Object(o.k)(e,h,j):void 0,N=k&&Object(o.qb)(e,k),P=Object(o.Cb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.T)(e,t)):Object(o.T)(e,c)),{direction:A,noHighlight:R}=T&&a||{},x=s.messageIds&&s.messageIds.includes(u),{query:L}=Object(o.A)(e)||{},F=Object(m.K)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.U)(e,t)):Object(o.U)(e,u),{forceSenderName:v,sender:y,originSender:w,botSender:C,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.cb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:R},isForwarding:x,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:L,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.R)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.P)(e,h,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.rb)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.sb)(e,c),shouldLoopStickers:Object(o.tb)(e)}},(e,t)=>Object(d.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:d,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:h,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:w,replyMessage:C,replyMessageSender:E,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:R,lastSyncTime:x,highlight:L,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:q,isPinnedList:G,shouldAutoLoadMedia:_,shouldAutoPlayMedia:z,shouldLoopStickers:V,focusMessage:W,openMediaViewer:$,openAudioPlayer:Q,openUserInfo:K,openChat:Z,cancelSendingMessage:X,markMessagesRead:ee,sendPollVote:te,toggleMessageSelection:se,setReplyingToId:ne,openForwardMenu:re,clickInlineButton:oe})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),de=Object(c.q)(null);Object(jt.c)(le,t);const{width:be}=He(),{isContextMenuOpen:ue,contextMenuPosition:me,handleBeforeContextMenu:he,handleContextMenu:Oe,handleContextMenuClose:je,handleContextMenuHide:ge}=Object(yt.a)(ie),fe=b<=0,[pe,Ie]=Object(ct.a)(fe);Object(c.n)(()=>{fe||setTimeout(Ie,10*b)},[b,Ie,fe]);const{transitionClassNames:ve}=Object(Y.a)(pe,void 0,fe,!1),{chatId:ye,id:we,threadInfo:Ce}=e,Ee=Object(m.tb)(e),Me="scheduled"===q||e.isScheduled,Se=Object(m.ub)(e)&&!w,ke=Boolean(Ce)&&"thread"===q,{forwardInfo:Ne,viaBotId:Pe}=e,Te=Ne&&!A&&!Ne.isLinkedChannelPost,Ae=!!e.groupedId&&!e.isInAlbum,Re=Boolean(n)&&n.messages.length>1,{text:xe,photo:Le,video:Fe,audio:De,voice:Be,document:Ue,sticker:qe,contact:Ge,poll:_e,webPage:ze,invoice:We}=Object(m.v)(e),$e=Object(m.x)(e),Qe=Object(wt.a)(e,L,Ct($e)),Ke=void 0!==me,Je=Object(J.a)("Message message-list-item",u&&"first-in-group",h&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",Ee&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Se&&"has-reply",Ke&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",Re&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ve),Ye=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:h,poll:O,webPage:j,contact:g}=Object(m.v)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return Ct(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):h?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Se,customShape:$e,isLastInGroup:h,asForwarded:Te,hasThread:ke,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),et=!Ne||!A&&p?p:I,tt=Ne?I:p,at=R&&e.adminTitle||Ne&&!Te&&Ne.adminTitle||void 0;Object(Ve.a)(ye,Se?e.replyToMessageId:void 0,C,e.id),Bt(ie,ye,k,N,P),Object(c.o)(()=>{de.current&&(de.current.innerHTML=Ee?'':'')},[Ee]);const st=Object(c.m)(t=>{t.stopPropagation(),se({messageId:we,groupedId:e.groupedId})},[we,e.groupedId,se]),nt=Object(c.m)(e=>{const t=Re&&n&&n.messages?{messageId:we,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:we,withShift:e&&e.shiftKey};se(t)},[se,we,Re,n]),rt=Object(c.m)(()=>{ne({messageId:we})},[ne,we]),ot=Object(c.m)(e=>{e.stopPropagation()},[]),it=Object(c.m)(()=>{et&&(Object(m.lb)(et.id)?K({id:et.id}):Z({id:et.id}))},[et,K,Z]),lt=Object(c.m)(()=>{tt&&(Object(m.lb)(tt.id)?K({id:tt.id}):Z({id:tt.id}))},[tt,K,Z]),dt=Object(c.m)(()=>{v&&K({id:v.id})},[v,K]),bt=Object(c.m)(()=>{W({chatId:ye,threadId:H,messageId:e.replyToMessageId})},[W,ye,H,e.replyToMessageId]),ut=Object(c.m)(()=>{$({chatId:ye,threadId:H,messageId:we,origin:Me?l.h.ScheduledInline:l.h.Inline})},[ye,H,we,$,Me]),mt=Object(c.m)(()=>{Q({chatId:ye,messageId:we})},[ye,we,Q]),ht=Object(c.m)(e=>{$({chatId:ye,threadId:H,messageId:e,origin:Me?l.h.ScheduledAlbum:l.h.Album})},[ye,H,$,Me]),Ot=Object(c.m)(()=>{ee({messageIds:[we]})},[we,ee]),gt=Object(c.m)(()=>{X({chatId:ye,messageId:we})},[X,ye,we]),ft=Object(c.m)(e=>{te({chatId:ye,messageId:we,options:e})},[ye,we,te]),pt=Object(c.m)(()=>{re({fromChatId:ye,groupedId:e.groupedId})},[re,ye,e.groupedId]),It=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);re({fromChatId:ye,messageIds:e})}else re({fromChatId:ye,messageIds:[we]})},[n,re,ye,we]),vt=Object(c.m)(()=>{W({chatId:ye,threadId:i.MAIN_THREAD_ID,messageId:we})},[W,ye,we]),St=Object(c.m)(()=>{W(Ae?{chatId:Ne.fromChatId,groupedId:e.groupedId,groupedChatId:ye}:{chatId:Ne.fromChatId,messageId:Ne.fromMessageId})},[W,Ne,e,ye,Ae]),kt=Object(ae.a)();let Nt,Pt="";const Tt=Object(c.p)(()=>Re?Lt(Ee,Boolean(Te),n,be):void 0,[Re,be,Ee,Te,n]),At=Te?28:0;if(Re||!Le&&!Fe)Tt&&(Nt=Math.max(Et(Boolean(xe)),Tt.containerStyle.width));else{let t;Le?t=Mt(e).width:Fe&&(t=Fe.isRound?Ze.d:Mt(e).width),t&&(Nt=Math.max(Et(Boolean(xe)),t))}Nt&&(Pt=`width: ${Nt+At}px`);const Rt=Object(c.p)(()=>at?Dt(at):void 0,[at]),xt=!(Ke||D||T)&&(!Ae||j),Ft=xt&&R&&!Me,Ht=xt&&(Ne&&(Ne.isChannelPost||A&&!Ee)&&Ne.fromMessageId||G),Gt=e.threadInfo&&(!Ae||j)&&"thread"===q&&!d;return c.a.createElement("div",{ref:ie,id:"message"+we,className:Je,style:Rt?`--meta-safe-author-width: ${Rt}px`:void 0,"data-message-id":we,onClick:D?nt:void 0,onDoubleClick:D?void 0:rt,onMouseDown:D?void 0:he,onContextMenu:D?void 0:Oe,onMouseEnter:Ae&&!j?Ra:void 0,onMouseLeave:Ae&&!j?xa:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":we,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(J.a)("message-select-control group-select",U&&"is-selected"),onClick:st},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=et&&Object(m.lb)(et.id),t=et&&e?et:void 0,a=et&&!e?et:void 0,s=!et&&Ne?Ne.hiddenUserName:void 0;return c.a.createElement(Ut.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:x,onClick:t||a?it:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&Ae?nt:void 0},c.a.createElement("div",{className:Ye,style:Pt},Ye.includes("has-appendix")&&c.a.createElement("div",{className:"svg-appendix",ref:de}),Te&&!$e&&(!Ae||O)&&c.a.createElement("div",{className:"message-title"},kt("ForwardedMessage")),function(){const t=Object(J.a)("content-inner",Te&&!$e&&"forwarded-message",Se&&"reply-message"),r=h&&!Qe&&!Te&&!ke;return c.a.createElement("div",{className:t,onDoubleClick:ot},function(){if($e||!(o&&!Le&&!Fe||Te||Pe||f)||Ae&&!O)return;let t,a;tt?(t=Object(m.U)(tt),Te||(a="color-"+Object(m.X)(tt))):Ne&&Ne.hiddenUserName&&(t=Ne.hiddenUserName);return c.a.createElement("div",{className:"message-title"},t?c.a.createElement("span",{className:Object(J.a)(tt&&"interactive",a),onClick:tt?lt:void 0},Object(Xe.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},kt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:dt},Object(Xe.a)("@"+v.username))),Ne&&Ne.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title"},kt("DiscussChannel")):e.adminTitle&&!R?c.a.createElement("span",{className:"admin-title"},e.adminTitle):void 0)}(),Se&&c.a.createElement(_t,{message:C,sender:E,observeIntersection:a,onClick:bt}),qe&&c.a.createElement(Yt,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:V,lastSyncTime:x}),F&&c.a.createElement(Zt.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:x}),Re&&c.a.createElement(Sa,{album:n,albumLayout:Tt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,isOwn:Ee,hasCustomAppendix:r,lastSyncTime:x,onMediaClick:ht}),!Re&&Le&&c.a.createElement(na,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ut,onCancelUpload:gt}),!Re&&Fe&&Fe.isRound&&c.a.createElement(Pa,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,lastSyncTime:x}),!Re&&Fe&&!Fe.isRound&&c.a.createElement(da,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:z,uploadProgress:S,lastSyncTime:x,onClick:ut,onCancelUpload:gt}),(De||Be)&&c.a.createElement(Vt.a,{message:e,uploadProgress:S,lastSyncTime:x,isSelectable:Ae,isSelected:B,onPlay:mt,onReadMedia:!Be||Ee&&!A?void 0:Ot,onCancelUpload:gt}),Ue&&c.a.createElement(zt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:Ae,isSelected:B,onCancelUpload:gt}),Ge&&c.a.createElement(ua,{contact:Ge}),_e&&c.a.createElement(pa,{message:e,poll:_e,onSendVote:ft}),!F&&Qe&&c.a.createElement("p",{className:"text-content"},Qe),ze&&c.a.createElement(ya,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ut,onCancelMediaTransfer:gt}),We&&c.a.createElement(wa,{message:e}))}(),(!Ae||j)&&c.a.createElement($t,{message:e,outgoingStatus:M,signature:at,onClick:nt}),Ft?c.a.createElement(ce.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Forward message",onClick:j?pt:It},c.a.createElement("i",{className:"icon-share-filled"})):Ht?c.a.createElement(ce.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:G?vt:St},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,Gt&&c.a.createElement(Aa,{message:e,disabled:d})),e.inlineButtons&&c.a.createElement(Ta,{message:e,onClick:oe})),me&&c.a.createElement(qt,{isOpen:ue,anchor:me,message:e,album:n,messageListType:q,onClose:je,onCloseAnimationEnd:ge}))}));a(226);const Da=h.b?1e3:350,Ba=h.f?300:500,Ua=Object(g.a)(e=>e(),200,!1),Ha=Object(g.j)(e=>e());var qa=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.nb)(e,t):Object(o.m)(e,t),l=Object(o.Bb)(e,t,a);if(a!==i.MAIN_THREAD_ID&&!(r&&l&&r[l]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,h=Object(o.H)(e,t),O=a===i.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&u&&!u.groupedId;let j;if(Object(o.K)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(m.jb)(n),canPost:Object(m.e)(n,a),isChatWithSelf:Object(o.O)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.G)(e,t,a),isViewportNewest:"thread"!==s||Object(o.W)(e,t,a),threadFirstMessageId:Object(o.F)(e,t,a),focusingId:h,isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:l,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(d.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,isChatLoaded:b,isChannelChat:u,canPost:O,bottomOffset:j,isChatWithSelf:f,messageIds:p,messagesById:I,firstUnreadId:v,isViewportNewest:y,threadFirstMessageId:w,isRestricted:C,restrictionReason:E,focusingId:M,isSelectModeActive:S,animationLevel:k,loadViewportMessages:N,markMessageListRead:P,markMessagesRead:T,setScrollOffset:A,lastMessage:x,botDescription:L,threadTopMessageId:F,hasLinkedChat:D})=>{const B=Object(c.q)(null),U=Object(c.q)("thread"===a&&Object(o.ob)(Object(s.e)(),e,t)||0),H=Object(c.q)(),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(v),z=Object(c.q)(),V=Object(c.q)(),W=Object(c.q)(!1),$=Object(c.q)(!p),[Q,Y]=Object(c.r)(),[Z,X]=Object(c.r)(Boolean(M)),ee=Boolean(p);Object(he.a)(()=>{ee&&Object(g.d)(()=>{$.current=!1})},[ee]),Object(he.a)(()=>{z.current=v},[v]);const{observe:te,freeze:se,unfreeze:ne}=Object(jt.a)({rootRef:B,throttleMs:Da,margin:Ba}),{observe:ce,freeze:re,unfreeze:oe}=Object(jt.a)({rootRef:B},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),z.current&&t>=z.current&&P({maxId:t}),s.length&&T({messageIds:s})});Object(he.a)(()=>{V.current=M,M?(se(),re()):(oe(),ne())},[M]);const{observe:ie}=Object(jt.a)({rootRef:B,throttleMs:Da});Object(c.n)(()=>{M?X(!0):setTimeout(()=>{X(!1)},200)},[M]);const le=Object(c.p)(()=>{if(!p||!I)return;const e=!F||p[0]&&w!==p[0]?p:[F,...p];if(!e.length)return;const t=e.map(e=>I[e]);return Ot(Object(d.k)(t,["date","id"]),_.current)},[p,I,w,F]),[de,be,ue]=Object(c.p)(()=>"thread"===a?[Object(g.a)(()=>N({direction:l.e.Backwards}),1e3,!0,!1),Object(g.a)(()=>N({direction:l.e.Forwards}),1e3,!0,!1),Object(g.a)(()=>N({direction:l.e.Around}),1e3,!0,!1)]:[],[N,p]),{isScrolled:me,updateStickyDates:Oe}=gt(),je=Object(c.m)(()=>{if(W.current)return void(W.current=!1);const s=B.current;V.current||Oe(s,r),Ua(()=>{Object(g.b)(()=>{s.parentElement&&(U.current=s.scrollHeight-s.scrollTop,"thread"===a&&A({chatId:e,threadId:t,scrollOffset:U.current}))})})},[Oe,r,a,A,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Y(e.contentRect.height)});return e.observe(B.current),()=>{e.disconnect()}},[]),Object(c.o)(()=>{h.d&&Ha(()=>{if(!B.current.querySelector(".AnimatedSticker.is-playing"))return;const e=B.current.style;e.webkitOverflowScrolling="auto"===e.webkitOverflowScrolling?"":"auto"})}),Object(c.n)(()=>{if(!ue||!b||C||M)return;const e=B.current;(!p||p.length{const s=B.current;if(G.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=y&&p&&p.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=U.current,b=G.current[G.current.length-1],u=b?b.offsetHeight:0,m=y&&t&&d-(a||l)-u<=100;let h;const O=p&&e&&p[0]!==e[0],j=p&&e&&p[p.length-1]!==e[e.length-1];if(m&&j&&!O&&(b&&Object(g.b)(()=>{Object(pt.a)(s,b,"end",20)}),h=i-l,U.current=Math.max(i-h,l),!c))return;const f=void 0!==a&&a!==Q,I=H.current&&s.querySelector("#"+H.current),v=!I&&_.current&&s.querySelector(".unread-divider");if(m&&f)h=i-l;else if(I){h=o+(I.getBoundingClientRect().top-(q.current||0))}else h=v?v.offsetTop-(r?60:10):i-d;Object(ft.a)(s,h),V.current||(W.current=!0,Object(g.b)(()=>{W.current=!1})),U.current=Math.max(i-h,l)},[p,y,Q,r]),Object(c.n)(()=>{(!k||k>0)&&Object(K.b)(200+n.c)},[k,S]);const ge=Object(ae.a)(),fe=Boolean(e&&Object(m.lb)(e)),pe=Boolean(!fe&&!u||f),Ie=Object(J.a)("MessageList custom-scroll",!pe&&"no-avatars",u&&"no-avatars",(!O||"none"!==j)&&"bottom-padding","none"!==j&&"bottom-padding-"+j,S&&"select-mode-active",Z&&"has-focusing",me&&"scrolled");return c.a.createElement("div",{ref:B,className:Ie,onScroll:je},C?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(u?"channel":"chat"))):L?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(Xe.a)(ge(L),["br","emoji","links"]))):p&&!le?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,ge("NoMessages"))):p&&le||x?c.a.createElement(vt,{containerRef:B,className:"messages-container",messageIds:p||[x.id],containerHeight:Q,listItemElementsRef:G,focusingId:M,anchorIdRef:H,anchorTopRef:q,loadMoreForwards:be,loadMoreBackwards:de,isViewportNewest:y,firstUnreadId:v,onFabToggle:i},function(e,t,a,s,r,o,i,l,b,u,h,O,j,g=!1,f=!1){const p=c.a.createElement("div",{className:Object(J.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),I=f?0:t.reduce((e,t)=>e+Object(d.h)(t.senderGroups).length,0);let v=0;const y=t.map((t,f,y)=>{const w=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!ht(t[0])&&Object(m.db)(t[0])){const e=t[0];return Object(d.e)([e.id===l.current&&p,c.a.createElement(Gt,{key:e.id,message:e,observeIntersection:a,appearanceOrder:I-++v})])}let w;return Object(d.h)(t.map((C,E)=>{const M=ht(C)?C.mainMessage:C,S=ht(C)?C:void 0,k=Object(m.tb)(M),N=ht(C),P=t[E+1];M.previousLocalId&&i.current==="message"+M.previousLocalId&&(i.current="message"+M.id);const T=!N&&M.groupedId?M.groupedId:void 0,A=P&&!ht(P)?P.groupedId:void 0,R={isFirstInGroup:0===E,isLastInGroup:E===t.length-1,isFirstInDocumentGroup:Boolean(T&&T!==w),isLastInDocumentGroup:Boolean(T&&T!==A),isLastInList:E===t.length-1&&n===g.length-1&&f===y.length-1};w=T;const x=M.id===l.current&&l.current!==O||M.id===h&&l.current===O,L=Object(m.F)(M),F="scheduled"!==u?L:`${M.date}_${L}`;return Object(d.e)([x&&p,c.a.createElement(Fa,{key:F,message:M,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:S,withAvatar:R.isLastInGroup&&o&&!k&&!(M.id===h),withSenderName:R.isFirstInGroup&&o&&!k,threadId:b,messageListType:u,noComments:!1===j,appearanceOrder:I-++v,isFirstInGroup:R.isFirstInGroup,isLastInGroup:R.isLastInGroup,isFirstInDocumentGroup:R.isFirstInDocumentGroup,isLastInDocumentGroup:R.isLastInDocumentGroup,isLastInList:R.isLastInList}),M.id===h&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:"sticky-date",key:"date-header"},c.a.createElement("span",null,g&&t.originalDate===n.fb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.fb&&e("MessageScheduledOn",Object(R.c)(t.datetime,void 0,!0)),!g&&Object(R.c)(t.datetime))),Object(d.h)(w))});return Object(d.h)(y)}(ge,le||Ot([x]),ce,te,ie,pe,H,_,t,a,F,w,D,!!le&&"scheduled"===a,!le||!$.current)):c.a.createElement(ye.a,{color:"white"}))}));a(227);var Ga=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,canPost:c&&Object(m.e)(c,s),unreadCount:c&&s===i.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(d.l)(t,["focusLastMessage"]))(({isShown:e,messageListType:t,canPost:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(c.q)(null),o=Object(c.m)(()=>{if(e)if("thread"===t)n();else{const e=r.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(pt.a)(e,a,"end",20)}},[e,t,n]),i=Object(J.a)("ScrollDownButton",e&&"revealed",!a&&"no-composer");return c.a.createElement("div",{ref:r,className:i},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(ce.a,{color:"secondary",round:!0,onClick:o,ariaLabel:"Scroll to bottom"},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object($e.b)(s))))})),_a=a(123),za=a(124),Va=a(14);async function Wa(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:r}=t;let o,i;if(c.startsWith("image/"))if(a){const a=await Object(Va.g)(n),{width:r,height:i}=a;if(r>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),Wa(e,c,!0,s)):Wa(e,t,!1,s)}o={width:r,height:i}}else i=n;else if(c.startsWith("video/")){if(r<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Va.h)(n);o={width:e,height:t,duration:a}}i=await Object(Va.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var $a=a(172),Qa=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Ka={encoderPath:Qa,reuseWorker:!0},Ja={type:"audio/ogg"};let Ya,Za,Xa;async function es(){return Ya||(Ya=a.e(10).then(a.t.bind(null,305,7)),Za=(await Ya).default,Xa=new Za(Ka)),Ya}async function ts(e){await async function(){await es(),await Xa.start()}();const t=Date.now();let a;const s=[],n=[];Xa.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let r=!1;return function e(){if(r)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),o=a/n/255;t(o<.1?0:o),requestAnimationFrame(e)}(),()=>{r=!0}}(Xa,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{Xa.onstop=()=>{e({blob:new Blob(s,Ja),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},Xa.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Xa.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Xa.pause(),a=Date.now(),c()},e)}}}const as=["image/png","image/jpeg","image/gif"];function ss(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(wt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let ns,cs;var rs=a(59);var os=a(180);var is=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0};function ls(){return(ls=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,bs)return bs=!1,void e();ds&&(clearTimeout(ds),ds=void 0),ds=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(ce.a,ls({},t,{onMouseEnter:h.k?void 0:s,onMouseLeave:h.k?void 0:n,onClick:h.k?e:void 0}))});var ms=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0};var hs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0};var Os=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"MentionMenu",!t);return a?c.a.createElement(a,e):void 0};var js=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0};var gs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"EmojiTooltip",!t);return a?c.a.createElement(a,e):void 0};var fs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0},ps=a(173),Is=a(110);a(229);var vs=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.jb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let h,O;if(l?h=Object(o.k)(e,t,l):d?h=Object(o.D)(e,t,a,s):u&&1===i.length&&(h=Object(o.k)(e,c,i[0])),l&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.J)(e,h)),O||(O=Object(o.qb)(e,h))}else u&&(O=Object(m.lb)(c)?Object(o.Db)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:h,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(d.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:r,setReplyingToId:o,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&r),u=Object(Is.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(Y.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?o({messageId:void 0}):t?i({messageId:void 0}):r&&d()},[e,t,r,o,i,d]);Object(c.n)(()=>b?Object(X.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(J.a)("ComposerEmbeddedMessage",h),f=r&&r>1?r+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(ce.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(_t,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var ys=e=>{const{attachments:t}=e,a=Object(ve.a)(Ie.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0};var ws=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0};var Cs=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0};a(230);const Es=/https?:\/\/(www.)?([a-zA-Z0-9.-]{2,256})([a-zA-Z/.-]{1,256})([?|#][=&#a-zA-Z0-9]{2,128})?/;var Ms=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.bb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(d.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,webPagePreview:s,noWebPage:n,loadWebPagePreview:r,clearWebPagePreview:o,toggleMessageWebPage:l})=>{const d=Object(c.p)(()=>{const{text:e,entities:t}=Object(za.a)(a),s=t&&t.find(({type:e})=>e===i.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Es);return n?n[0]:void 0},[a]);Object(c.n)(()=>{d?r({text:d}):(o(),l({chatId:e,threadId:t}))},[e,l,o,d,r,t]),Object(he.a)(()=>{o(),l({chatId:e,threadId:t})},[e]);if(!s||!a.length||n)return;const{photo:b,...u}=s,m={content:{webPage:u}};return c.a.createElement("div",{className:"WebPagePreview"},c.a.createElement(ce.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{l({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ya,{message:m,inPreview:!0}))})),Ss=a(115);var ks=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0};var Ns=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0};var Ps,Ts=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0};a(231);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Ps||(Ps={}));var As=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.N)(e,n):void 0,l=Object(o.O)(e,t),d=r&&Object(o.ab)(e,t),b=Object(o.lb)(e,t);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:l,canScheduleUntilOnline:!l&&!r&&n&&c&&Object(m.lb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),withScheduledButton:a===i.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(m.kb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers}},(e,t)=>Object(d.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:l,threadId:d,messageListType:b,draft:u,chat:O,connectionState:j,isChatWithBot:f,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:w,isPollModalOpen:C,isPaymentModalOpen:E,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:x,contentToBeScheduled:L,shouldSuggestStickers:F,sendMessage:D,editMessage:B,saveDraft:U,clearDraft:H,showError:q,setStickerSearchQuery:G,setGifSearchQuery:_,forwardMessages:z,openPollModal:V,closePollModal:W,loadScheduledHistory:$,closePaymentModal:Q,openChat:K,clearReceipt:Y})=>{const Z=Object(c.q)(null),[ee,te]=Object(c.r)(""),se=Object(c.q)(),ne=Object(qe.a)(e),[re,oe,ie]=Object(ct.a)(),[le,de]=Object(c.r)(),ue=Object(c.q)(ee);Object(c.n)(()=>{ue.current=ee},[ee]),Object(c.n)(()=>{se.current=void 0},[l]),Object(c.n)(()=>{l&&x&&d===i.MAIN_THREAD_ID&&$()},[l,$,x,d]),Object(c.o)(()=>{Z.current&&(Z.current.innerHTML='')},[]),Object(c.n)(()=>{L&&(de(L),oe())},[L,oe]);const[me,he]=Object(c.r)([]),[Oe,je,ge]=Object(ct.a)(),[fe,pe,Ie]=Object(ct.a)(),[ve,ye,we]=Object(ct.a)(),[Ce,Ee,Me]=Object(ct.a)(),[Se,ke]=Object(ct.a)(),[Ne,Pe,Te]=Object(ct.a)(),{startRecordingVoice:Ae,stopRecordingVoice:Re,pauseRecordingVoice:xe,activeVoiceRecording:Le,currentRecordTime:Fe,recordButtonRef:Be,startRecordTimeRef:Ue}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{h.d&&es()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ts(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))});s.current=Date.now(),r(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,r(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(X.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),He=o?Ps.Edit:!h.l||Le||ee&&!me.length||y?Ps.Send:Ps.Record,Ge=!t,{isMentionMenuOpen:_e,mentionFilter:ze,closeMentionMenu:Ve,insertMention:We,mentionFilteredMembers:$e}=Object(os.a)(w&&!me.length,ee,te,void 0,P,T,A),{isContextMenuOpen:Qe,handleContextMenu:Ke,handleContextMenuClose:Je,handleContextMenuHide:Ye}=Object(yt.a)(Be,!(He===Ps.Send&&Ge)),Ze=Object(c.p)(()=>Object(m.c)(O,f),[O,f]),et=O&&Object(m.gb)(O),tt=Object(m.k)(O),{isEmojiTooltipOpen:at,closeEmojiTooltip:st}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=h.c&&1===Object(rs.a)(t)||!h.c&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isEmojiTooltipOpen:i,closeEmojiTooltip:r}}(Boolean(F&&Ze.canSendStickers&&!me.length),ee,N),nt=Object(c.m)(e=>{const t=window.getSelection(),a=document.getElementById(n.u),s=Object(Xe.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(t.rangeCount){const n=t.getRangeAt(0);if(Object($a.a)(n))return void(h.c?document.execCommand("insertText",!1,e):(!function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n&&(a.setStartAfter(n),a.setEndAfter(n),t.removeAllRanges(),t.addRange(a))}}(s),a.dispatchEvent(new Event("input",{bubbles:!0}))));te(`${ue.current}${s}`),h.f||requestAnimationFrame(()=>{Object(_a.a)(a)})}else te(`${ue.current}${s}`)},[]),rt=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object($a.a)(t))return void document.execCommand("delete",!1)}te(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(ue.current))},[]),ot=Object(c.m)(()=>{te(""),he([]),st(),ie(),de(void 0),Ve(),h.f?setTimeout(()=>we(),350):we()},[st,ie,Ve,we]),it=Object(qe.a)(l);Object(c.n)(()=>{it&&l!==it&&(Re(),ot())},[l,it,ot,Re]);const lt=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(ss(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.u);Object(_a.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(za.a)(e.current);a&&(t||Object(m.cb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(ue,te,o,ot,Ee,B);((e,t,a,s,r,o,i,l,d)=>{const b=Object(c.m)((e,t)=>{r.current.length&&!i?l({chatId:e,threadId:t,draft:Object(za.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(g.a)(e=>e(),n.t,!1),[t]),m=Object(qe.a)(t),h=Object(qe.a)(a);Object(c.n)(()=>(ns=t,cs=a,()=>{ns=void 0,cs=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(ss(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.u);Object(_a.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(qe.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{ns===t&&cs===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,l,d,ee,ue,te,o,U,H),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.u,n.v].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>as.includes(e.type)),i=o&&o.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await Wa(i.name,i,!0);t(t=>[...t,e])}l&&e(l)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(nt,he,o);const dt=Object(c.m)(async(e,t)=>{he(await Promise.all(e.map(e=>Wa(e.name,e,t))))},[]),bt=Object(c.m)(()=>{he([])},[]),ut=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=me;if(Le){const e=await Re();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Wa("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(za.a)(ue.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;q({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(tt&&!et){const e=Math.floor(Date.now()/1e3),t=se.current&&Math.floor(e-se.current),a=tt.nextSendDate&&tt.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(de({sticker:e}),oe()):(D({sticker:e}),requestAnimationFrame(ot))},[t,oe,D,ot]),ht=Object(c.m)(e=>{t?(de({gif:e}),oe()):(D({gif:e}),requestAnimationFrame(ot))},[t,oe,D,ot]),Ot=Object(c.m)(e=>{t?(de({poll:e}),W(),oe()):(D({poll:e}),W())},[W,oe,D,t]),jt=Object(c.m)(()=>{t?(de({isSilent:!0}),oe()):ut(!0)},[ut,oe,t]),gt=Object(c.m)(e=>{const{isSilent:t,...a}=le||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);le&&0!==Object.keys(a).length?(D({...le,scheduledAt:s}),requestAnimationFrame(ot)):ut(!!t,s),ie()},[ie,ut,ot,le,D]),ft=Object(c.m)(()=>{gt(new Date(1e3*n.fb))},[gt]),pt=Object(c.m)(()=>{ie(),de(void 0)},[ie]),It=Object(c.m)(e=>{"stickers"===e?(G({query:""}),_({query:void 0})):(_({query:""}),G({query:void 0}))},[G,_]),vt=Object(c.m)(()=>{const e=document.getElementById(n.u);h.f&&e===document.activeElement?(e.blur(),setTimeout(()=>{ye()},100)):ye()},[ye]),wt=Object(c.m)(()=>{K({id:l,threadId:d,type:"scheduled"})},[K,l,d]);Object(c.n)(()=>{I&&h.f&&we()},[I,we]),Object(c.n)(()=>{v?Pe():setTimeout(()=>{Te()},200)},[v,Te,Pe]);const Ct=Object(c.m)(()=>{switch(He){case Ps.Send:t?(Le&&xe(),oe()):(ut(),requestAnimationFrame(ot));break;case Ps.Record:Ae();break;case Ps.Edit:lt()}},[He,ot,t,Ae,lt,Le,oe,xe,ut]),Et=Object(ae.a)(),Mt=He===Ps.Record&&!Ze.canAttachMedia,St=Object(qe.a)(o,!0),kt=o||St,Nt=new Date;Nt.setSeconds(0),Nt.setMilliseconds(0);const Pt=new Date;Pt.setFullYear(Pt.getFullYear()+1);let Tt="Send message";switch(He){case Ps.Edit:Tt="Save edited message";break;case Ps.Record:Tt=Mt?"Posting media content is not allowed in this group.":"Record a voice message"}const At=Object(J.a)("Composer",!v&&"shown",Ne&&"hover-disabled"),Rt=Object(J.a)("mobile-symbol-menu-button",Se?ve&&"menu-opened":ve&&"is-loading");return c.a.createElement("div",{className:At},Ze.canAttachMedia&&c.a.createElement(Ss.a,{containerId:"#middle-column-portals"},c.a.createElement(Cs,{isOpen:e!==De.a.None,withQuick:[e,ne].includes(De.a.QuickFile),onHide:r,onFileSelect:dt})),c.a.createElement(ys,{attachments:me,caption:me.length?ee:"",canSuggestMembers:w,groupChatMembers:P,currentUserId:T,usersById:A,onCaptionUpdate:te,onSend:t?oe:ut,onClear:bt}),c.a.createElement(ws,{isOpen:Boolean(C),onClear:W,onSend:Ot}),c.a.createElement(Ns,{isOpen:Boolean(E),onClose:Q}),c.a.createElement(Ts,{isOpen:Boolean(M),onClose:Y}),kt&&c.a.createElement(is,{isOpen:Ce,isSchedule:"scheduled"===b,onClose:Me,message:kt}),c.a.createElement(Os,{isOpen:_e,filter:ze,onClose:Ve,onInsertUserName:We,filteredChatMembers:$e,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:Z}),c.a.createElement(vs,null),Ze.canAttachEmbedLinks&&c.a.createElement(Ms,{chatId:l,threadId:d,messageText:me.length?"":ee}),c.a.createElement("div",{className:"message-input-wrapper"},h.f?c.a.createElement(ce.a,{className:Rt,round:!0,color:"translucent",onClick:ve?we:vt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(be.a,{color:"gray"})):c.a.createElement(us,{className:""+(ve?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ye,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(ps.a,{id:"message-input-text",html:me.length?"":ee,placeholder:Le&&window.innerWidth<=600?"":Et("Message"),shouldSetFocus:ve,shouldSupressFocus:h.f&&ve,onUpdate:te,onSend:He===Ps.Edit?lt:t?oe:ut,onSupressedFocus:we}),k&&c.a.createElement(ce.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:wt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Le&&!o&&c.a.createElement(us,{className:""+(Oe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:je,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Le&&!o&&c.a.createElement(us,{className:""+(fe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:pe,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Le&&Fe&&c.a.createElement("span",{className:"recording-state"},Object(R.i)(Fe-Ue.current)),c.a.createElement(gs,{isOpen:at,onStickerSelect:mt}),c.a.createElement(ms,{isOpen:fe,allowedAttachmentOptions:Ze,onFileSelect:dt,onPollCreate:V,onClose:Ie}),S&&c.a.createElement(fs,{messageId:S,isOpen:Oe,onClose:ge}),c.a.createElement(hs,{isOpen:ve,allowedAttachmentOptions:Ze,onLoad:ke,onClose:we,onEmojiSelect:nt,onStickerSelect:mt,onGifSelect:ht,onRemoveSymbol:rt,onSearchOpen:It}))),Le&&c.a.createElement(ce.a,{round:!0,color:"danger",className:"cancel",onClick:Re,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(ce.a,{ref:Be,round:!0,color:"secondary",className:`${He} ${Le?"recording":""}`,disabled:Mt,ariaLabel:Tt,onClick:Ct,onContextMenu:He===Ps.Send&&Ge?Ke:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),Ge&&c.a.createElement(js,{isOpen:Qe,onSilentSend:p?void 0:jt,onScheduleSend:t?void 0:oe,onClose:Je,onCloseAnimationEnd:Ye}),c.a.createElement(ks,{isOpen:re,withTimePicker:!0,selectedAt:Nt.getTime(),maxAt:Object(R.k)(Pt),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:pt,onSubmit:gt,onSecondButtonClick:a?ft:void 0}))}));var Rs=e=>{const{isActive:t}=e,a=Object(ve.a)(Ie.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0};var xs=e=>{const{isActive:t}=e,a=Object(ve.a)(Ie.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0};var Ls=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0};a(232);const Fs=h.f?450+n.c:void 0;function Ds(e){return"file"===e.kind&&e.type&&n.k.includes(e.type)}var Bs=Object(c.h)(Object(s.h)(e=>{const{isBackgroundBlurred:t,customBackground:a,patternColor:s}=e.settings.byKey,n=Boolean((a||"").match(/^#[a-f\d]{6,8}$/i)),c=Object(o.y)(e),{chats:{listIds:r}}=e;if(!c||!r.active)return{customBackground:a,isBackgroundBlurred:t,isCustomBackgroundColor:n};const{chatId:i,threadId:l,type:d}=c,b=Object(o.f)(e,i),u=Object(o.gb)(e,i),{chatId:O,messageId:j}=e.audioPlayer,g=b&&Object(m.e)(b,l),f=Object(o.K)(e,i),p="pinned"===d;return{chatId:i,threadId:l,messageListType:d,isPrivate:Object(m.lb)(i),canPost:!p&&(!b||g)&&(!f||h.f),isPinnedMessageList:p,messageSendingRestrictionReason:b&&Object(m.J)(b),hasPinnedOrAudioMessage:Boolean(u&&u.length)||Boolean(O&&j),customBackground:a,patternColor:s,isCustomBackgroundColor:n,isRightColumnShown:Object(o.V)(e),isBackgroundBlurred:t,isMobileSearchActive:Boolean(h.f&&Object(o.A)(e)),isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel}},(e,t)=>Object(d.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:l,hasPinnedOrAudioMessage:d,customBackground:b,patternColor:u,isCustomBackgroundColor:m,isRightColumnShown:O,isBackgroundBlurred:j,isMobileSearchActive:g,isSelectModeActive:f,animationLevel:p,openChat:I,unpinAllMessages:v,loadUser:y})=>{const{width:w}=He(),[C,E]=Object(c.r)(De.a.None),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(!1),P=Ge(e,Fs),T=Ge(t,Fs),A=Ge(a,Fs),R=Ge(o,Fs);Object(c.n)(()=>e?Object(X.a)(()=>{I({id:void 0})}):void 0,[e,I]),Object(c.n)(()=>{E(De.a.None)},[e]),Object(c.n)(()=>{s&&y({userId:e})},[e,s,y]);const x=Object(c.m)(e=>{if(h.k)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(Ds);E(a?De.a.QuickFile:De.a.Document)},[]),L=Object(c.m)(()=>{E(De.a.None)},[]),F=Object(c.m)(()=>{N(!0)},[]),D=Object(c.m)(()=>{N(!1)},[]),B=Object(c.m)(()=>{v({chatId:e}),D(),I({id:e})},[v,I,D,e]),U=(e=>{const[t,a]=Object(c.r)(e);return Object(c.n)(()=>{e&&(e.startsWith("#")?a(e):Be.c(n.l,n.l,Be.a.Blob).then(e=>{a("url("+URL.createObjectURL(e))}))},[e]),t})(b),H=d&&(wn.W&&w=n.V&&w_e(w,R),[R,w]),K=Object(ae.a)();return c.a.createElement("div",{id:"MiddleColumn",className:q,style:`\n --composer-hidden-scale: ${_};\n --toolbar-hidden-scale: ${z};\n --unpin-hidden-scale: ${$};\n --toolbar-unpin-hidden-scale: ${Q};\n --composer-translate-x: ${V}px;\n --toolbar-translate-x: ${W}px;\n --pattern-color: ${u};\n `},c.a.createElement("div",{id:"middle-column-bg",style:U?"--custom-background: "+U:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),P&&T&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:R?x:void 0},c.a.createElement(ut,{chatId:P,threadId:T,messageListType:A}),c.a.createElement(ee.a,{name:p===n.e?"slide":"fade",activeKey:"thread"===A&&T===i.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(qa,{key:`${P}-${T}-${A}`,chatId:P,threadId:T,type:A,hasTools:H,onFabToggle:S,bottomOffset:R?"none":r?"big":"small"}),c.a.createElement("div",{className:Object(J.a)("middle-column-footer",!R&&"no-composer")},R&&c.a.createElement(As,{chatId:P,threadId:T,messageListType:A,dropAreaState:C,onDropHide:L}),r&&c.a.createElement("div",{className:"unpin-button-container"},c.a.createElement(ce.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:F},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,K("Chat.PanelHidePinnedMessages")))),!r&&!R&&l&&c.a.createElement("div",{className:G},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,l))),c.a.createElement(xs,{messageListType:A,isActive:f,canPost:R})))),c.a.createElement(Ga,{isShown:M})),h.f&&c.a.createElement(Rs,{isActive:Boolean(g)})),e&&c.a.createElement(Ls,{isOpen:k,chatId:e,onClose:D,onUnpin:B}))}));a(233);const Us=Object(g.a)(e=>e(),200,!1);var Hs;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Statistics=4]="Statistics",e[e.Management=5]="Management",e[e.ManageInitial=6]="ManageInitial",e[e.ManageChannelSubscribers=7]="ManageChannelSubscribers",e[e.ManageChatAdministrators=8]="ManageChatAdministrators",e[e.ManageChatPrivacyType=9]="ManageChatPrivacyType",e[e.ManageDiscussion=10]="ManageDiscussion",e[e.ManageGroupPermissions=11]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=12]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=13]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=14]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=15]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=16]="ManageGroupAdminRights",e[e.ManageGroupMembers=17]="ManageGroupMembers",e[e.StickerSearch=18]="StickerSearch",e[e.GifSearch=19]="GifSearch",e[e.PollResults=20]="PollResults"}(Hs||(Hs={}));var qs=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(m.jb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.O)(e,i.id)&&(Object(m.lb)(i.id)||(Object(m.gb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(d.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","searchMessagesByDate"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStatistics:n,isStickerSearch:r,isGifSearch:o,isPollResults:i,profileState:d,managementScreen:b,canManage:u,isChannel:m,onClose:O,messageSearchQuery:j,stickerSearchQuery:g,gifSearchQuery:f,setLocalTextSearchQuery:p,setStickerSearchQuery:I,setGifSearchQuery:v,searchTextMessagesLocal:y,toggleManagement:w,searchMessagesByDate:C})=>{var E;const M=Object(c.q)(null),[S,k,N]=Object(ct.a)(),P=Object(c.m)(e=>{p({query:e}),e.length&&Us(y)},[y,p]),T=Object(c.m)(e=>{C({timestamp:e.valueOf()/1e3}),N()},[N,C]),A=Object(c.m)(e=>{I({query:e})},[I]),R=Object(c.m)(e=>{v({query:e})},[v]),[x,L]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{L(!e)},300)},[e]);const F=Object(ae.a)(),D=t?d===l.k.Profile?Hs.Profile:d===l.k.SharedMedia?Hs.SharedMedia:d===l.k.MemberList?Hs.MemberList:-1:a?Hs.Search:i?Hs.PollResults:r?Hs.StickerSearch:o?Hs.GifSearch:s?b===l.g.Initial?Hs.ManageInitial:b===l.g.ChatPrivacyType?Hs.ManageChatPrivacyType:b===l.g.Discussion?Hs.ManageDiscussion:b===l.g.ChannelSubscribers?Hs.ManageChannelSubscribers:b===l.g.GroupPermissions?Hs.ManageGroupPermissions:b===l.g.ChatAdministrators?Hs.ManageChatAdministrators:b===l.g.GroupRemovedUsers?Hs.ManageGroupRemovedUsers:b===l.g.GroupUserPermissionsCreate?Hs.ManageGroupUserPermissionsCreate:b===l.g.GroupUserPermissions?Hs.ManageGroupUserPermissions:b===l.g.GroupRecentActions?Hs.ManageGroupRecentActions:b===l.g.ChatAdminRights?Hs.ManageGroupAdminRights:b===l.g.GroupMembers?Hs.ManageGroupMembers:void 0:n?Hs.Statistics:void 0,B=null!==(E=We(D,!0))&&void 0!==E?E:-1;function U(){if(-1!==B)switch(B){case Hs.PollResults:return c.a.createElement("h3",null,F("PollResults"));case Hs.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(re.a,{value:j,onChange:P}),c.a.createElement(ce.a,{round:!0,size:"smaller",color:"translucent",onClick:k,ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case Hs.ManageInitial:return c.a.createElement("h3",null,F("Edit"));case Hs.ManageChatPrivacyType:return c.a.createElement("h3",null,F(m?"ChannelTypeHeader":"GroupTypeHeader"));case Hs.ManageDiscussion:return c.a.createElement("h3",null,F("Discussion"));case Hs.ManageChatAdministrators:return c.a.createElement("h3",null,F("ChannelAdministrators"));case Hs.ManageGroupRecentActions:return c.a.createElement("h3",null,F("Group.Info.AdminLog"));case Hs.ManageGroupAdminRights:return c.a.createElement("h3",null,F("EditAdminRights"));case Hs.ManageGroupPermissions:return c.a.createElement("h3",null,F("ChannelPermissions"));case Hs.ManageGroupRemovedUsers:return c.a.createElement("h3",null,F("ChannelBlockedUsers"));case Hs.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,F("ChannelAddException"));case Hs.ManageGroupUserPermissions:return c.a.createElement("h3",null,F("UserRestrictions"));case Hs.StickerSearch:return c.a.createElement(re.a,{value:g,placeholder:"Search Stickers",onChange:A});case Hs.GifSearch:return c.a.createElement(re.a,{value:f,placeholder:F("SearchGifsTitle"),onChange:R});case Hs.Statistics:return c.a.createElement("h3",null,F("Statistics"));case Hs.SharedMedia:return c.a.createElement("h3",null,F("SharedMedia"));case Hs.ManageChannelSubscribers:return c.a.createElement("h3",null,F("ChannelSubscribers"));case Hs.MemberList:case Hs.ManageGroupMembers:return c.a.createElement("h3",null,F("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,F("Info")),c.a.createElement("section",{className:"tools"},u&&c.a.createElement(ce.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:F("Edit"),onClick:w},c.a.createElement("i",{className:"icon-edit"}))))}}const H=h.f||D===Hs.SharedMedia||D===Hs.MemberList||s,q=Object(J.a)("animated-close-icon",x&&"no-transition");return Object(c.n)(()=>{M.current.classList.toggle("state-back",H)},[H]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(ce.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:O,ariaLabel:F(H?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:M,className:q})),c.a.createElement(ee.a,{name:x?"none":"slide-fade",activeKey:B},U),!h.f&&c.a.createElement(ks,{isOpen:S,isPastMode:!0,submitButtonLabel:F("JumpToDate"),onClose:N,onSubmit:T}))})),Gs=a(119);function _s(e,t,a,s,r,o){const i=Object(c.q)();Object(he.a)(()=>{t===e&&r&&o&&(i.current=Object(m.w)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(Gs.a)(s?a:void 0,i.current,void 0,"media"===e?n.hb:n.T);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var zs=a(53);const Vs=Object(g.g)(e=>e(),250,!1);let Ws=!1;var $s=a(102),Qs=a(95);var Ks=Object(c.h)(Object(s.h)((e,{userId:t})=>{const{lastSyncTime:a}=e;return{lastSyncTime:a,user:Object(o.Db)(e,t)}},(e,t)=>Object(d.l)(t,["loadFullUser"]))(({lastSyncTime:e,user:t,forceShowSelf:a,loadFullUser:s})=>{const{id:n,fullInfo:r,username:o,phoneNumber:i,isSelf:l}=t||{};Object(c.n)(()=>{e&&s({userId:n})},[s,n,e]);const d=Object(ae.a)();if(!t||l&&!a)return;const b=r&&r.bio,u=i&&Object(ba.c)(i);return c.a.createElement("div",{className:"ChatExtra"},b&&!!b.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-info"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(b,["br","links","emoji"])),c.a.createElement("p",{className:"subtitle"},d("UserBio")))),o&&!!o.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-mention"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(o)),c.a.createElement("p",{className:"subtitle"},d("Username")))),u&&!!u.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-phone"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},u),c.a.createElement("p",{className:"subtitle"},d("Phone")))))}));var Js=Object(c.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(o.f)(e,t);return{chat:a,canInviteUsers:a&&(!Object(m.jb)(a)&&!Object(m.yb)(a,"inviteUsers")||Object(m.q)(a,"inviteUsers"))}})(({chat:e,canInviteUsers:t})=>{const a=Object(ae.a)();if(!e||e.isRestricted)return;const s=Object(m.g)(e),n=Object(m.h)(e),r=0===n.indexOf("http")?n:"http://"+n;return c.a.createElement("div",{className:"ChatExtra"},s&&!!s.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-info"}),c.a.createElement("div",null,c.a.createElement("p",{className:"title"},Object(Xe.a)(s,["br","links","emoji"])),c.a.createElement("p",{className:"subtitle"},a("Info")))),t&&!!n.length&&c.a.createElement("div",{className:"item"},c.a.createElement("i",{className:"icon-mention"}),c.a.createElement("div",null,c.a.createElement(va.a,{url:r,className:"title",text:n}),c.a.createElement("p",{className:"subtitle"},a("SetUrlPlaceholder")))))})),Ys=a(155),Zs=a(174),Xs=a(109);a(237);const en=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function tn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var an=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(m.kb)(s),b=s&&Object(m.jb)(s),u=d||b&&Object(m.gb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(m.lb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&h&&{members:h,usersById:l},isRightColumnShown:Object(o.V)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(d.l)(t,["setLocalMediaSearchType","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:d,mediaSearchType:b,hasMembersTab:u,areMembersHidden:O,members:j,usersById:g,isRightColumnShown:f,isRestricted:p,lastSyncTime:I,setLocalMediaSearchType:v,searchMediaMessagesLocal:y,openMediaViewer:w,openAudioPlayer:C,openUserInfo:E,focusMessage:M})=>{const S=Object(c.q)(null),k=Object(c.q)(null),[N,P]=Object(c.r)(0),T=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...en],[u,s]),A=T[N].type,[R,x,L,F]=function(e,t,a,s,n,r,o,i,l,d){const b="members"!==a&&s?s:a,u=Object(c.p)(()=>{if(n&&r)return Object(m.W)(n.map(({userId:e})=>e),r)},[n,r]),[h,O,j]=_s("media",b,t,d,o,i),[g,f,p]=_s("documents",b,t,d,o,i),[I,v,y]=_s("links",b,t,d,o,i),[w,C,E]=_s("audio",b,t,d,o,i);let M,S,k=!1;switch(b){case"members":M=u,S=void 0;break;case"media":M=h,S=O,k=j;break;case"documents":M=g,S=f,k=p;break;case"links":M=I,S=v,k=y;break;case"audio":M=w,S=C,k=E}return[b,M,S,k]}(0,y,A,b,j,g,o,d,0,I),D=T.findIndex(({type:e})=>e===R),{handleScroll:B}=function(e,t,a,s){Object(zs.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Ws=!1},350))}},[t,s]),Object(zs.a)(([t])=>{if(a!==l.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Ws=!0,Object(pt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Ws=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=l.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?l.k.MemberList:l.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Ws||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Ws||Vs(n)},[n])}}(S,A,t,a),{applyTransitionFix:U,releaseTransitionFix:H}=function(e){return Object(c.n)(()=>{function t(){const t=e.current,a=t.querySelector(".Transition"),s=t.querySelector(".TabList");a&&s&&(a.style.minHeight=t.offsetHeight-s.offsetHeight+"px")}return t(),window.addEventListener("resize",t,!1),()=>{window.removeEventListener("resize",t,!1)}},[e]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(S),[q,G]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),_=Object(c.m)(()=>{H(),G()},[H,G]);Object(c.n)(()=>{v({mediaType:A})},[v,A]);const z=r||e,V=Object(c.m)(e=>{w({chatId:z,threadId:i.MAIN_THREAD_ID,messageId:e,origin:l.h.SharedMedia})},[z,w]),W=Object(c.m)(e=>{C({chatId:z,messageId:e})},[z,C]),$=Object(c.m)(e=>{E({id:e})},[E]),Q=Object(c.m)(e=>{M({chatId:z,messageId:e})},[z,M]);let K;Object(c.n)(()=>{if(k.current&&h.k)return Object(me.b)(k.current,{onSwipe:(e,t)=>{t===me.a.Left?P(Math.min(N+1,T.length-1)):t===me.a.Right&&P(Math.max(0,N-1))}})},[N,T.length]);const J="members"===R||!u&&"media"===R;J?K=f?0:1e3:x||(K=n.ib);const Y=Object(Is.a)([e,R],K);function Z(){if(!x||!Y||!o){const e=J&&x&&!Y;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(be.a,null))}if(!x.length){let e;switch(R){case"members":e=O?"You have no access to group members list.":"No members found";break;case"documents":e="No documents found.";break;case"links":e="No links found.";break;case"audio":e="No audio found.";break;default:e="No media found."}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(Xs.a,{text:e}))}return c.a.createElement("div",{className:`content ${R}-list`,teactFastList:!0},"media"===R?x.map(e=>o[e]&&c.a.createElement(Ys.a,{key:e,message:o[e],onClick:V})):"documents"===R?x.map(e=>o[e]&&c.a.createElement(zt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Q})):"links"===R?x.map(e=>o[e]&&c.a.createElement(Zs.a,{key:e,message:o[e],onMessageClick:Q})):"audio"===R?x.map(e=>o[e]&&c.a.createElement(Vt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:I,className:"scroll-item",onPlay:W,onDateClick:Q})):"members"===R?x.map((e,t)=>c.a.createElement(Qs.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>$(e)},c.a.createElement(Qe.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement($s.a,{ref:S,className:"Profile custom-scroll",itemSelector:tn(R),items:x,cacheBuster:q,preloadBackwards:n.hb,isDisabled:"members"===A,noFastList:!0,onLoadMore:L,onScroll:B},!F&&function(e,t){return c.a.createElement("div",{className:"profile-info"},t?c.a.createElement(c.a.Fragment,null,c.a.createElement(Qe.a,{userId:t,avatarSize:"jumbo",forceShowSelf:t!==e,withMediaViewer:!0,withFullInfo:!0}),c.a.createElement(Ks,{userId:t,forceShowSelf:t!==e})):c.a.createElement(c.a.Fragment,null,c.a.createElement(Ke.a,{chatId:e,avatarSize:"jumbo",withMediaViewer:!0,withFullInfo:!0}),c.a.createElement(Js,{chatId:e})))}(e,r),!p&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ee.a,{ref:k,name:"slide",activeKey:D,renderCount:T.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:U,onStop:_},Z),c.a.createElement(ge.a,{activeTab:N,tabs:T,onSwitchTab:P})))}));var sn=e=>{const t=Object(ve.a)(Ie.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var nn=e=>{const t=Object(ve.a)(Ie.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(ye.a,null)};var cn=()=>{const e=Object(ve.a)(Ie.a.Extra,"Statistics");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var rn=()=>{const e=Object(ve.a)(Ie.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var on=()=>{const e=Object(ve.a)(Ie.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};var ln=()=>{const e=Object(ve.a)(Ie.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(ye.a,null)};a(238);const dn=Object.keys(l.l).length/2,bn=Object.keys(l.g).length/2;function un(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var mn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.kb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(d.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","toggleStatistics","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,toggleStatistics:d,openUserInfo:b,closeLocalTextSearch:u,setStickerSearchQuery:m,setGifSearchQuery:h,closePollResults:O})=>{var j;const{width:g}=He(),[f,p]=Object(c.r)(l.k.Profile),[I,v]=Object(c.r)(l.g.Initial),[y,w]=Object(c.r)(),[C,E]=Object(c.r)(),M=f!==l.k.Profile,S=void 0!==e,k=e===l.l.ChatInfo||e===l.l.UserInfo,N=e===l.l.Search,P=e===l.l.Management,T=e===l.l.Statistics,A=e===l.l.StickerSearch,R=e===l.l.GifSearch,x=e===l.l.PollResults,L=g<=n.W,[F,D]=Object(c.r)(!S),B=null!==(j=We(e,!0,!r))&&void 0!==j?j:-1,U=Object(c.m)(()=>{switch(e){case l.l.ChatInfo:if(M){p(l.k.Profile);break}o();break;case l.l.UserInfo:if(M){p(l.k.Profile);break}b({id:void 0});break;case l.l.Management:switch(I){case l.g.Initial:i();break;case l.g.ChatPrivacyType:case l.g.Discussion:case l.g.GroupPermissions:case l.g.GroupType:case l.g.ChatAdministrators:case l.g.ChannelSubscribers:case l.g.GroupMembers:v(l.g.Initial);break;case l.g.GroupUserPermissionsCreate:case l.g.GroupRemovedUsers:case l.g.GroupUserPermissions:v(l.g.GroupPermissions),w(void 0),E(void 0);break;case l.g.ChatAdminRights:case l.g.GroupRecentActions:v(l.g.ChatAdministrators)}break;case l.l.Statistics:d();break;case l.l.Search:un(),u();break;case l.l.StickerSearch:case l.l.GifSearch:un(),m({query:void 0}),h({query:void 0});break;case l.l.PollResults:O()}},[e,M,o,b,d,O,I,i,u,m,h]),H=Object(c.m)((e,t)=>{w(e),E(t)},[]);function q(){if(-1!==B)switch(B){case l.l.ChatInfo:case l.l.UserInfo:return c.a.createElement(an,{key:s||t,chatId:t,userId:s,profileState:f,onProfileStateChange:p});case l.l.Search:return c.a.createElement(sn,{chatId:t,threadId:a});case l.l.Management:return c.a.createElement(nn,{chatId:t,currentScreen:I,isPromotedByCurrentUser:C,selectedChatMemberId:y,onScreenSelect:v,onChatMemberSelect:H});case l.l.Statistics:return c.a.createElement(cn,null);case l.l.StickerSearch:return c.a.createElement(rn,null);case l.l.GifSearch:return c.a.createElement(on,null);case l.l.PollResults:return c.a.createElement(ln,null)}}return Object(c.n)(()=>S?Object(X.a)(U):void 0,[S,U]),Object(c.n)(()=>{setTimeout(()=>{D(!S)},300)},[S]),Object(c.n)(()=>{S&&L&&U()},[L]),Object(mt.a)(([a,s])=>{(a===l.l.ChatInfo&&e===l.l.UserInfo||a===l.l.UserInfo&&e===l.l.ChatInfo||s!==t)&&(p(l.k.Profile),v(l.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},L&&c.a.createElement("div",{className:"overlay-backdrop",onClick:U}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement(qs,{chatId:t,isColumnOpen:S,isProfile:k,isSearch:N,isManagement:P,isStatistics:T,isStickerSearch:A,isGifSearch:R,isPollResults:x,profileState:f,managementScreen:I,onClose:U}),c.a.createElement(ee.a,{name:F?"none":"zoom-fade",renderCount:dn+bn,activeKey:P?dn+I:B},q)))}));var hn=Object(c.h)(({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var On=({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0};var jn=({isOpen:e})=>{const t=Object(ve.a)(Ie.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0};var gn=e=>{const{isOpen:t}=e,a=Object(ve.a)(Ie.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0};a(239);let fn,pn,In=!1;function vn(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}var yn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.V)(e),isMediaViewerOpen:Object(o.S)(e),isForwardModalOpen:Object(o.Q)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s}},(e,t)=>Object(d.l)(t,["loadAnimatedEmojis"]))(({lastSyncTime:e,loadAnimatedEmojis:t,isLeftColumnShown:a,isRightColumnShown:r,isMediaViewerOpen:i,isForwardModalOpen:l,animationLevel:d,hasNotifications:b,hasErrors:u,audioMessage:m})=>{n.o&&!In&&(In=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&t()},[e,t]);const{transitionClassNames:h}=Object(Y.a)(!a,void 0,!0),{transitionClassNames:O}=Object(Y.a)(r,void 0,!0),j=Object(J.a)(h.replace(/([\w-]+)/g,"middle-column-$1"),O.replace(/([\w-]+)/g,"right-column-$1"));function g(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",j.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",j.includes("right-column-open"))},[j]),Object(c.n)(()=>{d>0&&(document.body.classList.add("animating-right-column"),Object(K.b)(350+n.c),fn&&(clearTimeout(fn),fn=void 0),fn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),fn=void 0},350+n.c))},[d,r]),Object(Z.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(pn),pn=window.setInterval(()=>{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,vn(!0))}else document.title="Telegram",vn(!1);t++},1e3)},()=>{clearInterval(pn),pn=void 0,document.title="Telegram",vn(!1)}),c.a.createElement("div",{id:"Main",className:j,onDrop:g,onDragOver:g},c.a.createElement(Fe,null),c.a.createElement(Bs,null),c.a.createElement(mn,null),c.a.createElement(hn,{isOpen:i}),c.a.createElement(gn,{isOpen:l}),c.a.createElement(On,{isOpen:b}),c.a.createElement(jn,{isOpen:u}),m&&c.a.createElement(bt,{key:m.id,message:m,noUi:!0}))}));n.o&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()}}]); +//# sourceMappingURL=3.4bcadbdcb5986d5c9ba9.js.map \ No newline at end of file diff --git a/dist/3.b70839d141349ff143e4.js.map b/dist/3.4bcadbdcb5986d5c9ba9.js.map similarity index 99% rename from dist/3.b70839d141349ff143e4.js.map rename to dist/3.4bcadbdcb5986d5c9ba9.js.map index ad3cfb604..418e0f3c3 100644 --- a/dist/3.b70839d141349ff143e4.js.map +++ b/dist/3.4bcadbdcb5986d5c9ba9.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/lib/lovely-chart/utils.js","webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/hooks/usePrevForAnimation.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/hooks/useCurrentOrPrev.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumb.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/MentionMenu.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/UserExtra.tsx","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/Statistics.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["getMaxMin","array","length","max","min","i","value","mergeArrays","arrays","concat","apply","sumArrays","sums","n","l","j","proxyMerge","obj1","obj2","Proxy","get","obj","prop","undefined","throttle","fn","ms","shouldRunFirst","isPending","args","interval","_args","window","setInterval","clearInterval","throttleWithRaf","waiting","requestAnimationFrame","debounce","shouldRunLast","waitingTimeout","clearTimeout","setTimeout","addEventListener","e","state","chatId","id","threadId","messageListType","type","getDispatch","openChat","noPushState","addReducer","global","actions","payload","currentMessageList","selectCurrentMessageList","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","history","pushState","updateCurrentMessageList","isChatInfoShown","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","avatarOwnerId","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","newGlobal","getGlobal","lastMessageId","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","focusMessage","noHighlight","groupedId","groupedChatId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","replaceSettings","management","byChatId","isActive","isStatisticsShown","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","cb","runThrottledForLoadTopChats","runDebouncedForFetchFullChat","runDebouncedForFetchOnlines","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","map","Number","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","preloadedChatIds","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","IS_TOUCH_ENV","loadPinnedMessages","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","deleteChatFolder","unreadCount","url","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","uploadProgressCallbacks","Map","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","firstMessageId","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","setReplyingToId","clearWebPagePreview","selectReplyingToId","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","offset","shouldResetVoters","v","a","indexOf","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","copyTextToClipboard","link","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","replaceUsers","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","button","sendBotCommand","command","openTelegramLink","open","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","settings","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","isShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isLoading","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","update","selectIsChatListed","loadTopChats","isNotJoined","listId","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","selectIsViewportNewest","addViewportId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","twoFaSettings","memo","name","label","checked","disabled","onChange","onCheck","handleChange","useCallback","event","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","theme","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","openTipsChat","setGlobalSearchDate","setSettingOption","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","isNewThemeDark","customBackground","DARK_THEME_BG_COLOR","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","lang","useLang","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_INFO","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","SearchInput","inputId","focused","placeholder","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","Spinner","resolverFn","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","transitionRef","activeTab","setActiveTab","useState","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","captureEvents","onSwipe","SwipeDirection","Left","Right","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","onSwitchTab","Transition","ref","activeKey","renderCount","LeftSearchAsync","props","LeftSearch","useModuleLoader","Bundles","Extra","Loading","ContactListAsync","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","SettingsAsync","NewChatAsync","NewChat","ArchivedChatsAsync","ContentType","ArchivedChats","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","handleSearchQuery","captureEscKeyListener","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","removeEventListener","usePrevForAnimation","duration","prev","usePrevious","timeoutRef","isCurrentPresent","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","HeaderMenuContainerAsync","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","useFlag","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","senderName","getSenderTitle","noUi","closeAudioPlayer","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","renderAudio","subtitle","renderVoice","audioChatId","audioMessageId","audioMessage","originChat","messagesCount","pinnedIds","isSelectModeActive","chatTitleLength","getChatTitle","originChatId","isChatWithBot","selectIsChatWithBot","pinnedMessageIds","firstPinnedMessage","canUnpin","pinnedMessageId","selectForwardedSender","topMessageTitle","openChatWithInfo","pinMessage","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","cycleRestrict","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","newIndex","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","componentEl","add","remove","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","isAlbum","messageOrAlbum","groupMessages","firstUnreadId","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","isFabFrozen","MessageScroll","containerHeight","listItemElementsRef","focusingId","anchorIdRef","anchorTopRef","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","updateFabVisibility","scrollHeight","scrollBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","dataset","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","preservedItemElements","element","teactFastList","data-is-active","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","calculateMediaDimensions","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","REM","getMaxWidth","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","calculateAuthorWidth","createElement","font","whiteSpace","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainerAsync","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","useIsIntersecting","pictogramId","senderTitle","MessageMeta","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumb","fullMediaData","useBlur","LAYERS_TRANSITION_DURATION","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","isPlayAllowed","setIsPlayAllowed","previewMediaData","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","useVideoCleanup","videoClassName","videoStyle","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","hasDocument","siteName","displayUrl","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","toString","stopPlaying","capturePlaying","onRelease","paused","ROUND_VIDEO_DIMENSIONS","poster","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","formatInteger","renderLabel","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","isLastInList","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","showCommentsButton","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","runThrottledOnTickEnd","throttleWithTickEnd","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","getCanPostInChat","selectFirstUnreadId","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","bottomOffset","markMessageListRead","setScrollOffset","scrollOffsetRef","selectScrollOffset","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","messageGroups","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","IS_IOS","webkitOverflowScrolling","clientHeight","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","isAtBottom","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isResized","unreadDivider","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","isPrivate","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","shouldRenderUnreadDivider","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messsageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","startsWith","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","formattedText","currentThreadId","DeleteMessageModalAsync","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenuAsync","AttachMenu","SymbolMenuAsync","SymbolMenu","MentionMenuAsync","MentionMenu","CustomSendMenuAsync","CustomSend","EmojiTooltipAsync","EmojiTooltip","BotKeyboardMenuAsync","BotKeyboardMenu","forwardMessageIds","replyingToId","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModalAsync","AttachmentModal","PollModalAsync","PollModal","DropAreaAsync","DropArea","RE_LINK","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","webPageWithoutPhoto","messageStub","CalendarModalAsync","CalendarModal","PaymentModalAsync","PaymentModal","ReceiptModalAsync","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionMenuOpen","mentionFilter","closeMentionMenu","insertMention","mentionFilteredMembers","useMentionMenu","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isEmojiTooltipOpen","closeEmojiTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useEmojiTooltip","canSendStickers","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","preventDefault","useClipboardPaste","handleFileSelect","files","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","containerId","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","onPollCreate","onEmojiSelect","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","selectedAt","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearchAsync","MobileSearch","MessageSelectToolbarAsync","MessageSelectToolbar","UnpinAllMessagesModalAsync","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBackgroundBlurred","isCustomBackgroundColor","isBotNotStarted","isPinnedMessageList","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","isMobileSearchActive","loadUser","setDropAreaState","isFabShown","setIsFabShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","renderingThreadId","renderingMessageListType","renderingCanPost","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_ENABLED","messagingDisabledClassName","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStatistics","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","backButtonRef","handleMessageSearchQueryChange","handleJumpToDate","valueOf","handleStickerSearchQueryChange","handleGifSearchQueryChange","shouldSkipTransition","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","Statistics","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","isPastMode","submitButtonLabel","useInfiniteScrollForSharedMedia","forSharedMediaType","currentResultType","handleLoadMore","messageIdsRef","getMessageContentIds","reverse","getMore","useInfiniteScroll","runThrottledForScroll","isScrollingProgrammatically","forceShowSelf","loadFullUser","formattedNumber","canInviteUsers","isUserRightBanned","getHasAdminRight","getChatDescription","getChatLink","TABS","buildInfiniteScrollItemSelector","resultType","mediaSearchType","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","tabType","noProfileInfo","searchMessages","getSortedUserIds","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","useProfileViewportIds","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","profileId","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","ListItem","teactOrderKey","InfiniteScroll","itemSelector","preloadBackwards","isDisabled","noFastList","onLoadMore","avatarSize","renderProfileInfo","shouldRestoreHeight","onStart","onStop","RightSearchAsync","RightSearch","ManagementAsync","Management","StatisticsAsync","StickerSearchAsync","GifSearchAsync","PollResultsAsync","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","toggleStatistics","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","onChatMemberSelect","prevContentKey","MediaViewer","NotificationsAsync","ErrorsAsync","Errors","ForwardPickerAsync","ForwardPicker","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","useBackgroundMode","initialUnread","selectCountNotMutedUnread","newUnread","onDrop","onDragOver","initApi"],"mappings":"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","file":"3.b70839d141349ff143e4.js","sourcesContent":["// https://jsperf.com/finding-maximum-element-in-an-array\nexport function getMaxMin(array) {\n const length = array.length;\n let max = array[0];\n let min = array[0];\n\n for (let i = 0; i < length; i++) {\n const value = array[i];\n\n if (value > max) {\n max = value;\n } else if (value < min) {\n min = value;\n }\n }\n\n return { max, min };\n}\n\n// https://jsperf.com/multi-array-concat/24\nexport function mergeArrays(arrays) {\n return [].concat.apply([], arrays);\n}\n\nexport function sumArrays(arrays) {\n const sums = [];\n const n = arrays.length;\n\n for (let i = 0, l = arrays[0].length; i < l; i++) {\n sums[i] = 0;\n\n for (let j = 0; j < n; j++) {\n sums[i] += arrays[j][i];\n }\n }\n\n return sums;\n}\n\nexport function proxyMerge(obj1, obj2) {\n return new Proxy({}, {\n get: (obj, prop) => {\n if (obj[prop] !== undefined) {\n return obj[prop];\n } else if (obj2[prop] !== undefined) {\n return obj2[prop];\n } else {\n return obj1[prop];\n }\n },\n });\n}\n\nexport function throttle(\n fn,\n ms,\n shouldRunFirst = true,\n) {\n let interval = null;\n let isPending;\n let args;\n\n return (..._args) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = window.setInterval(() => {\n if (!isPending) {\n window.clearInterval(interval);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn) {\n let waiting = false;\n let args;\n\n return function (..._args) {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n requestAnimationFrame(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function debounce(fn, ms, shouldRunFirst = true, shouldRunLast = true) {\n let waitingTimeout = null;\n\n return function () {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = null;\n } else if (shouldRunFirst) {\n fn();\n }\n\n waitingTimeout = setTimeout(() => {\n if (shouldRunLast) {\n fn();\n }\n\n waitingTimeout = null;\n }, ms);\n };\n}\n","import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\n\nwindow.addEventListener('popstate', (e) => {\n if (!e.state) {\n return;\n }\n\n const { chatId: id, threadId, messageListType: type } = e.state;\n\n getDispatch().openChat({\n id, threadId, type, noPushState: true,\n });\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = exitMessageSelectMode(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n\n if (!noPushState) {\n window.history.pushState({ chatId: id, threadId, messageListType: type }, '');\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 2000;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n});\n\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings } from '../../../types';\nimport { replaceSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('toggleStatistics', (global) => {\n return {\n ...global,\n isStatisticsShown: !global.isStatisticsShown,\n };\n});\n\naddReducer('openChat', (global, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n} from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 200;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForFetchFullChat = debounce((cb) => cb(), 500, false, true);\nconst runDebouncedForFetchOnlines = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n\n if (IS_TOUCH_ENV) {\n actions.loadPinnedMessages({ chatId: chatToPreload.id });\n }\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForFetchFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadSuperGroupOnlines', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n runDebouncedForFetchOnlines(() => callApi('fetchSuperGroupOnlines', chat));\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('deleteChannel', { channelId, accessHash });\n }\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\n }\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise } from '../../../util/schedulers';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nconst uploadProgressCallbacks = new Map();\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities,\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', draft);\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n const { chatId, maxId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n void callApi('markMessageListRead', { chat, threadId, maxId });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos, firstMessageId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo) {\n await rafPromise();\n }\n\n const global = getGlobal();\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query, limit: GLOBAL_SEARCH_SLICE });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chats: localChats,\n users: localUsers,\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chats: globalChats,\n users: globalUsers,\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n });\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { callApi } from '../../../api/gramjs';\nimport { selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateManagementProgress, updateUser, updateUsers,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationsSettings', () => {\n (async () => {\n const result = await callApi('loadNotificationsSettings');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, isShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, isShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, isShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n window.open(button.value);\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showError({ error: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n} from '../../selectors';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n if (update.chatId === currentChatId) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!message.isOutgoing) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds]\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const { chatId, threadId, threadInfo } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n global = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n }\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n\n if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../lib/lovely-chart/utils';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.isShowPreviews);\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n APP_INFO, DEFAULT_PATTERN_COLOR, FEEDBACK_URL, DARK_THEME_BG_COLOR, DARK_THEME_PATTERN_COLOR,\n} from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? 'Open menu' : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, onReset]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n const isNewThemeDark = newTheme === 'dark';\n\n setSettingOption({\n theme: newTheme,\n customBackground: isNewThemeDark ? DARK_THEME_BG_COLOR : undefined,\n patternColor: isNewThemeDark ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n switchTheme(newTheme, animationLevel > 0);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const lang = useLang();\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n Dark Mode\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n Telegram Features\n \n \n Report Bug\n \n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { theme, animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n orderedFolderIds?: number[];\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n loadChatFolders,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const [activeTab, setActiveTab] = useState(0);\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: 'All' },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveTab(index);\n }, []);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeTab >= folderTabs.length) {\n setActiveTab(0);\n }\n }, [activeTab, folderTabs]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, folderTabs]);\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n const lang = useLang();\n\n function renderCurrentTab() {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeTab].title);\n\n if (!activeFolder || activeTab === 0) {\n return ;\n }\n\n return ;\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n },\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadChatFolders']),\n)(ChatFolders));\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default LeftSearchAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default ContactListAsync;\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n New Private Chat\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n onSearchQuery,\n onContentChange,\n onReset,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n return (\n \n \n \n \n {() => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n \n
\n );\n};\n\nexport default memo(LeftMain);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default SettingsAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default NewChatAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default ArchivedChatsAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n default:\n break;\n }\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [content, setGlobalSearchQuery, setGlobalSearchChatId, setGlobalSearchDate, resetChatCreation, settingsScreen]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, setGlobalSearchQuery, searchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList ? captureEscKeyListener(() => handleReset()) : undefined),\n [content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n return (\n \n {() => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { query, date } = global.globalSearch;\n return { searchQuery: query, searchDate: date };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\n\nconst RESIZE_TIMEOUT_MS = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, RESIZE_TIMEOUT_MS, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n });\n\n return size;\n};\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevForAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && prev && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default HeaderMenuContainerAsync;\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canStartBot = Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n
\n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n const lang = useLang();\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiAudio, ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n senderName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, senderName, focusMessage, closeAudioPlayer,\n}) => {\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n const lang = useLang();\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }) => {\n const sender = selectSender(global, message);\n const senderName = sender ? getSenderTitle(sender) : undefined;\n\n return { senderName };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadOriginChat,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n};\n\ntype StateProps = {\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageTitle?: string;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatTitleLength?: number;\n chatsById?: Record;\n originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageTitle,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chatTitleLength,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\n\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [chatId]);\n\n // Modify index after unpinning\n useEffect(() => {\n setPinnedMessageIndex(pinnedMessagesCount ? cycleRestrict(pinnedMessagesCount, pinnedMessageIndex) : -1);\n }, [pinnedMessagesCount, pinnedMessageIndex]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, chat) => {\n if (isChatArchived(chat)) {\n return total;\n }\n\n const count = chat.unreadCount || 0;\n if (count && (!chat.isMuted || chat.unreadMentionsCount)) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n const lang = useLang();\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {isLeftColumnHideable && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n const originChat = selectThreadOriginChat(global, chatId, threadId);\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n let state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chatTitleLength: chat && getChatTitle(chat).length,\n chatsById,\n originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType === 'thread' && messagesById) {\n if (threadId === MAIN_THREAD_ID) {\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n state = {\n ...state,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n };\n }\n } else {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const sender = message ? selectForwardedSender(global, message) : undefined;\n const topMessageTitle = sender ? getSenderTitle(sender) : undefined;\n\n state = {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n messagesById,\n canUnpin: false,\n topMessageTitle,\n };\n }\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n containerHeight?: number;\n listItemElementsRef: MutableRefObject;\n anchorIdRef: MutableRefObject;\n anchorTopRef: MutableRefObject;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n focusingId?: number;\n onFabToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst FAB_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet isFabFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n containerHeight,\n listItemElementsRef,\n focusingId,\n anchorIdRef,\n anchorTopRef,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n children,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const updateFabVisibility = useCallback(() => {\n if (isFabFrozen) {\n return;\n }\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom === 0;\n\n onFabToggle(firstUnreadId ? !isAtBottom : !isNearBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger' && (target as HTMLDivElement).dataset.isActive) {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, ([{ target }]) => {\n if ((target as HTMLDivElement).dataset.isActive) {\n updateFabVisibility();\n }\n });\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Remember scroll position before updating height\n useOnChange(() => {\n if (!listItemElementsRef.current) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n }, [messageIds, containerHeight]);\n\n // Workaround for FAB flickering with tall incoming message\n useOnChange(() => {\n isFabFrozen = true;\n\n setTimeout(() => {\n isFabFrozen = false;\n }, FAB_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(updateFabVisibility, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMediaWithNoText = (photo || video) && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean) {\n return hasText ? MIN_MEDIA_WIDTH_WITH_TEXT : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: IDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n album: IAlbum,\n windowWidth: number,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getMaxWidth(isOwn, isForwarded, windowWidth);\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default ContextMenuContainerAsync;\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const content = renderActionMessageText(\n message,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const userId = message.senderId;\n const { targetUserId, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n\n useLang();\n\n const senderTitle = sender && getSenderTitle(sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl)}\n
\n
{renderText(senderTitle || title || NBSP)}
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(message, Boolean(mediaThumbnail)))\n )}\n

\n
\n
\n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default MessageMeta;\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { LAYERS_TRANSITION_DURATION } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useBlur from '../../../../hooks/useBlur';\n\nexport default function useBlurredMediaThumb(message: ApiMessage, fullMediaData?: string) {\n return useBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_MOBILE_SCREEN ? LAYERS_TRANSITION_DURATION : undefined,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) => {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n};\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbDataUri = useBlurredMediaThumb(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const thumbClassName = buildClassName(\n 'thumbnail',\n !thumbDataUri && 'empty',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n
\n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const thumbDataUri = useBlurredMediaThumb(message, previewBlobUrl);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const previewMediaData = previewBlobUrl || thumbDataUri;\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, isInline);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const thumbClassName = buildClassName('thumbnail', !previewMediaData && 'empty');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n const videoStyle = previewMediaData ? `background-image: url(${previewMediaData}); background-size: cover` : '';\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(shouldRenderThumb || !isInline) && (\n \n )}\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\n
\n )}\n
\n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000), summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {getPollTypeString(summary)}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'Quiz' : 'Anonymous Quiz';\n }\n\n if (summary.closed) {\n return 'Final results';\n }\n\n return summary.isPublic ? 'Poll' : 'Anonymous Poll';\n}\n\nfunction getReadableVotersCount(isQuiz: true | undefined, count?: number) {\n if (!count) {\n return isQuiz ? 'No answers yet' : 'No voters yet';\n }\n\n return isQuiz ? `${count} answered` : `${count} voted`;\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n if (webPage && (isSquarePhoto || webPage.hasDocument)) {\n window.open(webPage.url);\n } else if (onMediaClick) {\n onMediaClick();\n }\n }, [webPage, isSquarePhoto, onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = webPage;\n\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = [\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n ].filter(Boolean).join(' ');\n\n return (\n \n {photo && (\n \n )}\n
\n \n {title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrapedComponent: FC) {\n const Component: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n
\n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(Component));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport safePlay from '../../../util/safePlay';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbDataUri = useBlurredMediaThumb(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n requestAnimationFrame(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n playerEl.currentTime = 0;\n setIsActivated(true);\n capturePlaying();\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {shouldRenderThumb && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatInteger, formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\n}) => {\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
{renderLabel(messagesCount)}
\n \n \n );\n};\n\nfunction renderLabel(messagesCount: number) {\n if (messagesCount === 0) {\n return 'Leave a Comment';\n }\n\n if (messagesCount === 1) {\n return '1 Comment';\n }\n\n return `${formatInteger(messagesCount)} Comments`;\n}\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentsButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), width);\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), albumLayout.containerStyle.width);\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts &&

{textParts}

}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !customShape && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer) {\n senderTitle = getSenderTitle(senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n const showCommentsButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {contentClassName.includes('has-appendix') && (
)}\n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {showCommentsButton && }\n
\n {message.inlineButtons && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n ]),\n)(Message));\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages, selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n getCanPostInChat,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, throttleWithTickEnd, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n onFabToggle: (show: boolean) => void;\n hasTools?: boolean;\n bottomOffset: 'none' | 'small' | 'big';\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n canPost?: boolean;\n isChatWithSelf?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\nconst runThrottledOnTickEnd = throttleWithTickEnd((cb) => cb());\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n isChatLoaded,\n isChannelChat,\n canPost,\n bottomOffset,\n isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n // Updated when opening chat (to preserve divider even after messages are read)\n const memoUnreadDividerBeforeIdRef = useRef(firstUnreadId);\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n }, [firstUnreadId]);\n\n const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Workaround for an iOS bug when animated stickers sometimes disappear\n useLayoutEffect(() => {\n if (!IS_IOS) {\n return;\n }\n\n runThrottledOnTickEnd(() => {\n if (!(containerRef.current as HTMLDivElement).querySelector('.AnimatedSticker.is-playing')) {\n return;\n }\n\n const style = (containerRef.current as HTMLDivElement).style as any;\n style.webkitOverflowScrolling = style.webkitOverflowScrolling === 'auto' ? '' : 'auto';\n });\n });\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(container, lastItemElement, 'end', BOTTOM_FOCUS_MARGIN);\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n (!canPost || bottomOffset !== 'none') && 'bottom-padding',\n (bottomOffset !== 'none') && `bottom-padding-${bottomOffset}`,\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\n );\n\n return (\n
\n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : messageIds && !messageGroups ? (\n
{lang('NoMessages')}
\n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId?: number,\n threadFirstMessageId?: number,\n hasLinkedChat?: boolean,\n isSchedule = false,\n noAppearanceAnimation = false,\n) {\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const shouldRenderUnreadDivider = (\n (message.id === memoFirstUnreadIdRef.current && memoFirstUnreadIdRef.current !== threadFirstMessageId)\n || (message.id === threadTopMessageId && memoFirstUnreadIdRef.current === threadFirstMessageId)\n );\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n shouldRenderUnreadDivider && unreadDivider,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n
\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(dateGroup.datetime)}\n \n
\n {flatten(senderGroups)}\n \n );\n });\n\n return flatten(dateGroups);\n}\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n canPost: getCanPostInChat(chat, threadId),\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { getCanPostInChat } from '../../modules/helpers';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n canPost?: boolean;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n messageListType,\n canPost,\n unreadCount,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusLastMessage();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messsageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messsageElements[messsageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusLastMessage]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const canPost = chat && getCanPostInChat(chat, threadId);\n\n return {\n messageListType,\n canPost,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusLastMessage']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && input.tagName === 'INPUT' && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default DeleteMessageModalAsync;\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default AttachMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default SymbolMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionMenu = useModuleLoader(Bundles.Extra, 'MentionMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionMenu ? : undefined;\n};\n\nexport default MentionMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default CustomSendMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default EmojiTooltipAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default BotKeyboardMenuAsync;\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default AttachmentModalAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default PollModalAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default DropAreaAsync;\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = /https?:\\/\\/(www.)?([a-zA-Z0-9.-]{2,256})([a-zA-Z/.-]{1,256})([?|#][=&#a-zA-Z0-9]{2,128})?/;\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n if (!webPagePreview || !messageText.length || noWebPage) {\n return undefined;\n }\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = webPagePreview;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default CalendarModalAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default PaymentModalAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default ReceiptModalAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED, IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionMenu from './hooks/useMentionMenu';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport MentionMenu from './MentionMenu.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n canSuggestMembers?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionMenuOpen, mentionFilter,\n closeMentionMenu, insertMention,\n mentionFilteredMembers,\n } = useMentionMenu(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isEmojiTooltipOpen, closeEmojiTooltip } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n return;\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n } else {\n setHtml(`${htmlRef.current!}${newHtml}`);\n }\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeEmojiTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionMenu();\n\n if (IS_MOBILE_SCREEN) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeEmojiTooltip, closeCalendar, closeMentionMenu, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_MOBILE_SCREEN || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(resetComposer);\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const lang = useLang();\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'Send message';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Posting media content is not allowed in this group.'\n : 'Record a voice message';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n {allowedAttachmentOptions.canAttachEmbedLinks && (\n \n )}\n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \n )}\n \n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed]);\n\n return {\n isEmojiTooltipOpen: hasStickers,\n closeEmojiTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default MobileSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default MessageSelectToolbarAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default UnpinAllMessagesModalAsync;\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_ENABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevForAnimation from '../../hooks/usePrevForAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n customBackground?: string;\n patternColor?: string;\n isCustomBackgroundColor?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n customBackground,\n patternColor,\n isCustomBackgroundColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState(false);\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n\n const renderingChatId = usePrevForAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevForAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevForAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevForAnimation(canPost, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n }, [chatId]);\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items).every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const customBackgroundValue = useCustomBackground(customBackground);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const className = buildClassName(\n hasTools && 'has-header-tools',\n customBackground && !isCustomBackgroundColor && 'custom-bg-image',\n customBackground && isCustomBackgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_ENABLED ? 'mask-image-enabled' : 'mask-image-disabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const lang = useLang();\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.PanelHidePinnedMessages')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { isBackgroundBlurred, customBackground, patternColor } = global.settings.byKey;\n\n const isCustomBackgroundColor = Boolean((customBackground || '').match(/^#[a-f\\d]{6,8}$/i));\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n if (!currentMessageList || !listIds.active) {\n return {\n customBackground,\n isBackgroundBlurred,\n isCustomBackgroundColor,\n };\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n\n return {\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: Boolean(pinnedIds && pinnedIds.length) || Boolean(audioChatId && audioMessageId),\n customBackground,\n patternColor,\n isCustomBackgroundColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\n ]),\n)(MiddleColumn));\n","import { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { useEffect, useState } from '../lib/teact/teact';\n\nexport default (settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, cacheApi.Type.Blob)\n .then((blob) => {\n setValue(`url(${URL.createObjectURL(blob)}`);\n });\n }\n }, [settingValue]);\n\n return value;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal.async';\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStatistics?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Statistics,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStatistics,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : isStatistics ? (\n HeaderContent.Statistics\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n \n \n \n \n );\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.Statistics:\n return

{lang('Statistics')}

;\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

{lang('Info')}

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n shouldSkipTransition && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n {!IS_MOBILE_SCREEN && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'searchMessagesByDate',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, getSortedUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(groupChatMembers.map(({ userId }) => userId), usersById);\n }, [groupChatMembers, usersById]);\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberIds;\n getMore = undefined;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst UserExtra: FC = ({\n lastSyncTime, user, forceShowSelf, loadFullUser,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n\n useEffect(() => {\n if (lastSyncTime) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const lang = useLang();\n\n if (!user || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n const bio = fullInfo && fullInfo.bio;\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n\n return (\n
\n {bio && !!bio.length && (\n
\n \n
\n

{renderText(bio, ['br', 'links', 'emoji'])}

\n

{lang('UserBio')}

\n
\n
\n )}\n {username && !!username.length && (\n
\n \n
\n

{renderText(username)}

\n

{lang('Username')}

\n
\n
\n )}\n {formattedNumber && !!formattedNumber.length && (\n
\n \n
\n

{formattedNumber}

\n

{lang('Phone')}

\n
\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n\n return { lastSyncTime, user };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser']),\n)(UserExtra));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectChat } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserRightBanned,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport SafeLink from '../common/SafeLink';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n canInviteUsers?: boolean;\n};\n\nconst ChatExtra: FC = ({ chat, canInviteUsers }) => {\n const lang = useLang();\n\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const description = getChatDescription(chat);\n const link = getChatLink(chat);\n const url = link.indexOf('http') === 0 ? link : `http://${link}`;\n\n return (\n
\n {description && !!description.length && (\n
\n \n
\n

{renderText(description, ['br', 'links', 'emoji'])}

\n

{lang('Info')}

\n
\n
\n )}\n {canInviteUsers && !!link.length && (\n
\n \n
\n \n

{lang('SetUrlPlaceholder')}

\n
\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return { chat, canInviteUsers };\n },\n)(ChatExtra));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport { SHARED_MEDIA_SLICE, SLIDE_TRANSITION_DURATION } from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport UserExtra from './UserExtra';\nimport GroupExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const [activeTab, setActiveTab] = useState(0);\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = 'No documents found.';\n break;\n case 'links':\n text = 'No links found.';\n break;\n case 'audio':\n text = 'No audio found.';\n break;\n default:\n text = 'No media found.';\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n
\n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n
\n \n {renderSharedMedia}\n \n \n
\n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n {resolvedUserId ? (\n <>\n \n \n \n ) : (\n <>\n \n \n \n )}\n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector('.Transition');\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default RightSearchAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default ManagementAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StatisticsAsync: FC = () => {\n const Statistics = useModuleLoader(Bundles.Extra, 'Statistics');\n\n return Statistics ? : ;\n};\n\nexport default StatisticsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default StickerSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default GifSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default PollResultsAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport Statistics from './Statistics.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n toggleStatistics,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStatistics = contentKey === RightColumnContent.Statistics;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback(() => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo();\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined });\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Statistics:\n toggleStatistics();\n break;\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, toggleStatistics, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n case RightColumnContent.Statistics:\n return ;\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'toggleStatistics',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default NotificationsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default ErrorsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default ForwardPickerAsync;\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport { ANIMATION_END_DELAY, DEBUG } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasErrors: boolean;\n audioMessage?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst APP_NAME = 'Telegram';\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n loadAnimatedEmojis,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n loadAnimatedEmojis();\n }\n }, [lastSyncTime, loadAnimatedEmojis]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = APP_NAME;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n document.title = APP_NAME;\n updateIcon(false);\n });\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasErrors: Boolean(global.errors.length),\n audioMessage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadAnimatedEmojis']),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/lib/lovely-chart/utils.js","webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/hooks/usePrevForAnimation.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/hooks/useCurrentOrPrev.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumb.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/MentionMenu.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/UserExtra.tsx","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/Statistics.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["getMaxMin","array","length","max","min","i","value","mergeArrays","arrays","concat","apply","sumArrays","sums","n","l","j","proxyMerge","obj1","obj2","Proxy","get","obj","prop","undefined","throttle","fn","ms","shouldRunFirst","isPending","args","interval","_args","window","setInterval","clearInterval","throttleWithRaf","waiting","requestAnimationFrame","debounce","shouldRunLast","waitingTimeout","clearTimeout","setTimeout","addEventListener","e","state","chatId","id","threadId","messageListType","type","getDispatch","openChat","noPushState","addReducer","global","actions","payload","currentMessageList","selectCurrentMessageList","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","history","pushState","updateCurrentMessageList","isChatInfoShown","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","avatarOwnerId","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","newGlobal","getGlobal","lastMessageId","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","focusMessage","noHighlight","groupedId","groupedChatId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","replaceSettings","management","byChatId","isActive","isStatisticsShown","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","cb","runThrottledForLoadTopChats","runDebouncedForFetchFullChat","runDebouncedForFetchOnlines","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","map","Number","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","preloadedChatIds","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","IS_TOUCH_ENV","loadPinnedMessages","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","deleteChatFolder","unreadCount","url","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","uploadProgressCallbacks","Map","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","firstMessageId","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","setReplyingToId","clearWebPagePreview","selectReplyingToId","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","offset","shouldResetVoters","v","a","indexOf","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","copyTextToClipboard","link","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","replaceUsers","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","button","sendBotCommand","command","openTelegramLink","open","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","settings","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","isShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isLoading","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","update","selectIsChatListed","loadTopChats","isNotJoined","listId","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","selectIsViewportNewest","addViewportId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","twoFaSettings","memo","name","label","checked","disabled","onChange","onCheck","handleChange","useCallback","event","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","theme","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","openTipsChat","setGlobalSearchDate","setSettingOption","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","isNewThemeDark","customBackground","DARK_THEME_BG_COLOR","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","lang","useLang","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_INFO","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","SearchInput","inputId","focused","placeholder","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","Spinner","resolverFn","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","transitionRef","activeTab","setActiveTab","useState","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","captureEvents","onSwipe","SwipeDirection","Left","Right","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","onSwitchTab","Transition","ref","activeKey","renderCount","LeftSearchAsync","props","LeftSearch","useModuleLoader","Bundles","Extra","Loading","ContactListAsync","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","SettingsAsync","NewChatAsync","NewChat","ArchivedChatsAsync","ContentType","ArchivedChats","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","handleSearchQuery","captureEscKeyListener","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","removeEventListener","usePrevForAnimation","duration","prev","usePrevious","timeoutRef","isCurrentPresent","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","HeaderMenuContainerAsync","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","useFlag","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","senderName","getSenderTitle","noUi","closeAudioPlayer","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","renderAudio","subtitle","renderVoice","audioChatId","audioMessageId","audioMessage","originChat","messagesCount","pinnedIds","isSelectModeActive","chatTitleLength","getChatTitle","originChatId","isChatWithBot","selectIsChatWithBot","pinnedMessageIds","firstPinnedMessage","canUnpin","pinnedMessageId","selectForwardedSender","topMessageTitle","openChatWithInfo","pinMessage","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","cycleRestrict","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","newIndex","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","componentEl","add","remove","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","isAlbum","messageOrAlbum","groupMessages","firstUnreadId","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","isFabFrozen","MessageScroll","containerHeight","listItemElementsRef","focusingId","anchorIdRef","anchorTopRef","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","updateFabVisibility","scrollHeight","scrollBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","dataset","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","preservedItemElements","element","teactFastList","data-is-active","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","calculateMediaDimensions","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","REM","getMaxWidth","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","calculateAuthorWidth","createElement","font","whiteSpace","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainerAsync","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","useIsIntersecting","pictogramId","senderTitle","MessageMeta","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumb","fullMediaData","useBlur","LAYERS_TRANSITION_DURATION","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","isPlayAllowed","setIsPlayAllowed","previewMediaData","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","useVideoCleanup","videoClassName","videoStyle","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","hasDocument","siteName","displayUrl","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","toString","stopPlaying","capturePlaying","onRelease","paused","ROUND_VIDEO_DIMENSIONS","poster","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","formatInteger","renderLabel","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","isLastInList","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","showCommentsButton","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","runThrottledOnTickEnd","throttleWithTickEnd","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","getCanPostInChat","selectFirstUnreadId","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","bottomOffset","markMessageListRead","setScrollOffset","scrollOffsetRef","selectScrollOffset","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","messageGroups","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","IS_IOS","webkitOverflowScrolling","clientHeight","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","isAtBottom","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isResized","unreadDivider","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","isPrivate","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","shouldRenderUnreadDivider","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messsageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","startsWith","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","formattedText","currentThreadId","DeleteMessageModalAsync","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenuAsync","AttachMenu","SymbolMenuAsync","SymbolMenu","MentionMenuAsync","MentionMenu","CustomSendMenuAsync","CustomSend","EmojiTooltipAsync","EmojiTooltip","BotKeyboardMenuAsync","BotKeyboardMenu","forwardMessageIds","replyingToId","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModalAsync","AttachmentModal","PollModalAsync","PollModal","DropAreaAsync","DropArea","RE_LINK","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","webPageWithoutPhoto","messageStub","CalendarModalAsync","CalendarModal","PaymentModalAsync","PaymentModal","ReceiptModalAsync","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionMenuOpen","mentionFilter","closeMentionMenu","insertMention","mentionFilteredMembers","useMentionMenu","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isEmojiTooltipOpen","closeEmojiTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useEmojiTooltip","canSendStickers","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","preventDefault","useClipboardPaste","handleFileSelect","files","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","containerId","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","onPollCreate","onEmojiSelect","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","selectedAt","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearchAsync","MobileSearch","MessageSelectToolbarAsync","MessageSelectToolbar","UnpinAllMessagesModalAsync","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBackgroundBlurred","isCustomBackgroundColor","isBotNotStarted","isPinnedMessageList","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","isMobileSearchActive","loadUser","setDropAreaState","isFabShown","setIsFabShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","renderingThreadId","renderingMessageListType","renderingCanPost","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_ENABLED","messagingDisabledClassName","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStatistics","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","backButtonRef","handleMessageSearchQueryChange","handleJumpToDate","valueOf","handleStickerSearchQueryChange","handleGifSearchQueryChange","shouldSkipTransition","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","Statistics","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","isPastMode","submitButtonLabel","useInfiniteScrollForSharedMedia","forSharedMediaType","currentResultType","handleLoadMore","messageIdsRef","getMessageContentIds","reverse","getMore","useInfiniteScroll","runThrottledForScroll","isScrollingProgrammatically","forceShowSelf","loadFullUser","formattedNumber","canInviteUsers","isUserRightBanned","getHasAdminRight","getChatDescription","getChatLink","TABS","buildInfiniteScrollItemSelector","resultType","mediaSearchType","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","tabType","noProfileInfo","searchMessages","getSortedUserIds","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","useProfileViewportIds","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","profileId","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","ListItem","teactOrderKey","InfiniteScroll","itemSelector","preloadBackwards","isDisabled","noFastList","onLoadMore","avatarSize","renderProfileInfo","shouldRestoreHeight","onStart","onStop","RightSearchAsync","RightSearch","ManagementAsync","Management","StatisticsAsync","StickerSearchAsync","GifSearchAsync","PollResultsAsync","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","toggleStatistics","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","onChatMemberSelect","prevContentKey","MediaViewer","NotificationsAsync","ErrorsAsync","Errors","ForwardPickerAsync","ForwardPicker","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","useBackgroundMode","initialUnread","selectCountNotMutedUnread","newUnread","onDrop","onDragOver","initApi"],"mappings":"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","file":"3.4bcadbdcb5986d5c9ba9.js","sourcesContent":["// https://jsperf.com/finding-maximum-element-in-an-array\nexport function getMaxMin(array) {\n const length = array.length;\n let max = array[0];\n let min = array[0];\n\n for (let i = 0; i < length; i++) {\n const value = array[i];\n\n if (value > max) {\n max = value;\n } else if (value < min) {\n min = value;\n }\n }\n\n return { max, min };\n}\n\n// https://jsperf.com/multi-array-concat/24\nexport function mergeArrays(arrays) {\n return [].concat.apply([], arrays);\n}\n\nexport function sumArrays(arrays) {\n const sums = [];\n const n = arrays.length;\n\n for (let i = 0, l = arrays[0].length; i < l; i++) {\n sums[i] = 0;\n\n for (let j = 0; j < n; j++) {\n sums[i] += arrays[j][i];\n }\n }\n\n return sums;\n}\n\nexport function proxyMerge(obj1, obj2) {\n return new Proxy({}, {\n get: (obj, prop) => {\n if (obj[prop] !== undefined) {\n return obj[prop];\n } else if (obj2[prop] !== undefined) {\n return obj2[prop];\n } else {\n return obj1[prop];\n }\n },\n });\n}\n\nexport function throttle(\n fn,\n ms,\n shouldRunFirst = true,\n) {\n let interval = null;\n let isPending;\n let args;\n\n return (..._args) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = window.setInterval(() => {\n if (!isPending) {\n window.clearInterval(interval);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn) {\n let waiting = false;\n let args;\n\n return function (..._args) {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n requestAnimationFrame(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function debounce(fn, ms, shouldRunFirst = true, shouldRunLast = true) {\n let waitingTimeout = null;\n\n return function () {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = null;\n } else if (shouldRunFirst) {\n fn();\n }\n\n waitingTimeout = setTimeout(() => {\n if (shouldRunLast) {\n fn();\n }\n\n waitingTimeout = null;\n }, ms);\n };\n}\n","import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\n\nwindow.addEventListener('popstate', (e) => {\n if (!e.state) {\n return;\n }\n\n const { chatId: id, threadId, messageListType: type } = e.state;\n\n getDispatch().openChat({\n id, threadId, type, noPushState: true,\n });\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = exitMessageSelectMode(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n\n if (!noPushState) {\n window.history.pushState({ chatId: id, threadId, messageListType: type }, '');\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 2000;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n});\n\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings } from '../../../types';\nimport { replaceSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('toggleStatistics', (global) => {\n return {\n ...global,\n isStatisticsShown: !global.isStatisticsShown,\n };\n});\n\naddReducer('openChat', (global, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n} from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 200;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForFetchFullChat = debounce((cb) => cb(), 500, false, true);\nconst runDebouncedForFetchOnlines = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n\n if (IS_TOUCH_ENV) {\n actions.loadPinnedMessages({ chatId: chatToPreload.id });\n }\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForFetchFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadSuperGroupOnlines', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n runDebouncedForFetchOnlines(() => callApi('fetchSuperGroupOnlines', chat));\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('deleteChannel', { channelId, accessHash });\n }\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\n }\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise } from '../../../util/schedulers';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nconst uploadProgressCallbacks = new Map();\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities,\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', draft);\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n const { chatId, maxId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n void callApi('markMessageListRead', { chat, threadId, maxId });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos, firstMessageId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo) {\n await rafPromise();\n }\n\n const global = getGlobal();\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query, limit: GLOBAL_SEARCH_SLICE });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chats: localChats,\n users: localUsers,\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chats: globalChats,\n users: globalUsers,\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n });\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { callApi } from '../../../api/gramjs';\nimport { selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateManagementProgress, updateUser, updateUsers,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationsSettings', () => {\n (async () => {\n const result = await callApi('loadNotificationsSettings');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, isShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, isShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, isShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n window.open(button.value);\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showError({ error: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n} from '../../selectors';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n if (update.chatId === currentChatId) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!message.isOutgoing) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds]\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const { chatId, threadId, threadInfo } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n global = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n }\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n\n if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../lib/lovely-chart/utils';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.isShowPreviews);\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n APP_INFO, DEFAULT_PATTERN_COLOR, FEEDBACK_URL, DARK_THEME_BG_COLOR, DARK_THEME_PATTERN_COLOR,\n} from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? 'Open menu' : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, onReset]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n const isNewThemeDark = newTheme === 'dark';\n\n setSettingOption({\n theme: newTheme,\n customBackground: isNewThemeDark ? DARK_THEME_BG_COLOR : undefined,\n patternColor: isNewThemeDark ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n switchTheme(newTheme, animationLevel > 0);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const lang = useLang();\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n Dark Mode\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n Telegram Features\n \n \n Report Bug\n \n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { theme, animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n orderedFolderIds?: number[];\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n loadChatFolders,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const [activeTab, setActiveTab] = useState(0);\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: 'All' },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveTab(index);\n }, []);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeTab >= folderTabs.length) {\n setActiveTab(0);\n }\n }, [activeTab, folderTabs]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, folderTabs]);\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n const lang = useLang();\n\n function renderCurrentTab() {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeTab].title);\n\n if (!activeFolder || activeTab === 0) {\n return ;\n }\n\n return ;\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n },\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadChatFolders']),\n)(ChatFolders));\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default LeftSearchAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default ContactListAsync;\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n New Private Chat\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n onSearchQuery,\n onContentChange,\n onReset,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n return (\n \n \n \n \n {() => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n \n
\n );\n};\n\nexport default memo(LeftMain);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default SettingsAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default NewChatAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default ArchivedChatsAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n default:\n break;\n }\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [content, setGlobalSearchQuery, setGlobalSearchChatId, setGlobalSearchDate, resetChatCreation, settingsScreen]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, setGlobalSearchQuery, searchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList ? captureEscKeyListener(() => handleReset()) : undefined),\n [content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n return (\n \n {() => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { query, date } = global.globalSearch;\n return { searchQuery: query, searchDate: date };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\n\nconst RESIZE_TIMEOUT_MS = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, RESIZE_TIMEOUT_MS, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n });\n\n return size;\n};\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevForAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && prev && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default HeaderMenuContainerAsync;\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canStartBot = Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n
\n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n const lang = useLang();\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiAudio, ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n senderName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, senderName, focusMessage, closeAudioPlayer,\n}) => {\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n const lang = useLang();\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }) => {\n const sender = selectSender(global, message);\n const senderName = sender ? getSenderTitle(sender) : undefined;\n\n return { senderName };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadOriginChat,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n};\n\ntype StateProps = {\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageTitle?: string;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatTitleLength?: number;\n chatsById?: Record;\n originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageTitle,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chatTitleLength,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\n\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [chatId]);\n\n // Modify index after unpinning\n useEffect(() => {\n setPinnedMessageIndex(pinnedMessagesCount ? cycleRestrict(pinnedMessagesCount, pinnedMessageIndex) : -1);\n }, [pinnedMessagesCount, pinnedMessageIndex]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, chat) => {\n if (isChatArchived(chat)) {\n return total;\n }\n\n const count = chat.unreadCount || 0;\n if (count && (!chat.isMuted || chat.unreadMentionsCount)) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n const lang = useLang();\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {isLeftColumnHideable && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n const originChat = selectThreadOriginChat(global, chatId, threadId);\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n let state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chatTitleLength: chat && getChatTitle(chat).length,\n chatsById,\n originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType === 'thread' && messagesById) {\n if (threadId === MAIN_THREAD_ID) {\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n state = {\n ...state,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n };\n }\n } else {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const sender = message ? selectForwardedSender(global, message) : undefined;\n const topMessageTitle = sender ? getSenderTitle(sender) : undefined;\n\n state = {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n messagesById,\n canUnpin: false,\n topMessageTitle,\n };\n }\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n containerHeight?: number;\n listItemElementsRef: MutableRefObject;\n anchorIdRef: MutableRefObject;\n anchorTopRef: MutableRefObject;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n focusingId?: number;\n onFabToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst FAB_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet isFabFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n containerHeight,\n listItemElementsRef,\n focusingId,\n anchorIdRef,\n anchorTopRef,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n children,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const updateFabVisibility = useCallback(() => {\n if (isFabFrozen) {\n return;\n }\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom === 0;\n\n onFabToggle(firstUnreadId ? !isAtBottom : !isNearBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger' && (target as HTMLDivElement).dataset.isActive) {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, ([{ target }]) => {\n if ((target as HTMLDivElement).dataset.isActive) {\n updateFabVisibility();\n }\n });\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Remember scroll position before updating height\n useOnChange(() => {\n if (!listItemElementsRef.current) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n }, [messageIds, containerHeight]);\n\n // Workaround for FAB flickering with tall incoming message\n useOnChange(() => {\n isFabFrozen = true;\n\n setTimeout(() => {\n isFabFrozen = false;\n }, FAB_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(updateFabVisibility, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMediaWithNoText = (photo || video) && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean) {\n return hasText ? MIN_MEDIA_WIDTH_WITH_TEXT : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: IDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n album: IAlbum,\n windowWidth: number,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getMaxWidth(isOwn, isForwarded, windowWidth);\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default ContextMenuContainerAsync;\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const content = renderActionMessageText(\n message,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const userId = message.senderId;\n const { targetUserId, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n\n useLang();\n\n const senderTitle = sender && getSenderTitle(sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl)}\n
\n
{renderText(senderTitle || title || NBSP)}
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(message, Boolean(mediaThumbnail)))\n )}\n

\n
\n
\n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default MessageMeta;\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { LAYERS_TRANSITION_DURATION } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useBlur from '../../../../hooks/useBlur';\n\nexport default function useBlurredMediaThumb(message: ApiMessage, fullMediaData?: string) {\n return useBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_MOBILE_SCREEN ? LAYERS_TRANSITION_DURATION : undefined,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) => {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n};\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbDataUri = useBlurredMediaThumb(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const thumbClassName = buildClassName(\n 'thumbnail',\n !thumbDataUri && 'empty',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n
\n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const thumbDataUri = useBlurredMediaThumb(message, previewBlobUrl);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const previewMediaData = previewBlobUrl || thumbDataUri;\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, isInline);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const thumbClassName = buildClassName('thumbnail', !previewMediaData && 'empty');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n const videoStyle = previewMediaData ? `background-image: url(${previewMediaData}); background-size: cover` : '';\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(shouldRenderThumb || !isInline) && (\n \n )}\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\n
\n )}\n \n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000), summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {getPollTypeString(summary)}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'Quiz' : 'Anonymous Quiz';\n }\n\n if (summary.closed) {\n return 'Final results';\n }\n\n return summary.isPublic ? 'Poll' : 'Anonymous Poll';\n}\n\nfunction getReadableVotersCount(isQuiz: true | undefined, count?: number) {\n if (!count) {\n return isQuiz ? 'No answers yet' : 'No voters yet';\n }\n\n return isQuiz ? `${count} answered` : `${count} voted`;\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n if (webPage && (isSquarePhoto || webPage.hasDocument)) {\n window.open(webPage.url);\n } else if (onMediaClick) {\n onMediaClick();\n }\n }, [webPage, isSquarePhoto, onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = webPage;\n\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = [\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n ].filter(Boolean).join(' ');\n\n return (\n \n {photo && (\n \n )}\n
\n \n {title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrapedComponent: FC) {\n const Component: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n \n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(Component));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n \n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useBlurredMediaThumb from './hooks/useBlurredMediaThumb';\nimport safePlay from '../../../util/safePlay';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbDataUri = useBlurredMediaThumb(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n requestAnimationFrame(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n playerEl.currentTime = 0;\n setIsActivated(true);\n capturePlaying();\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {shouldRenderThumb && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatInteger, formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\n}) => {\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
{renderLabel(messagesCount)}
\n \n \n );\n};\n\nfunction renderLabel(messagesCount: number) {\n if (messagesCount === 0) {\n return 'Leave a Comment';\n }\n\n if (messagesCount === 1) {\n return '1 Comment';\n }\n\n return `${formatInteger(messagesCount)} Comments`;\n}\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentsButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), width);\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), albumLayout.containerStyle.width);\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts &&

{textParts}

}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !customShape && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer) {\n senderTitle = getSenderTitle(senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n const showCommentsButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {contentClassName.includes('has-appendix') && (
)}\n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {showCommentsButton && }\n
\n {message.inlineButtons && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n ]),\n)(Message));\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages, selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n getCanPostInChat,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, throttleWithTickEnd, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n onFabToggle: (show: boolean) => void;\n hasTools?: boolean;\n bottomOffset: 'none' | 'small' | 'big';\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n canPost?: boolean;\n isChatWithSelf?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\nconst runThrottledOnTickEnd = throttleWithTickEnd((cb) => cb());\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n isChatLoaded,\n isChannelChat,\n canPost,\n bottomOffset,\n isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n // Updated when opening chat (to preserve divider even after messages are read)\n const memoUnreadDividerBeforeIdRef = useRef(firstUnreadId);\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n }, [firstUnreadId]);\n\n const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Workaround for an iOS bug when animated stickers sometimes disappear\n useLayoutEffect(() => {\n if (!IS_IOS) {\n return;\n }\n\n runThrottledOnTickEnd(() => {\n if (!(containerRef.current as HTMLDivElement).querySelector('.AnimatedSticker.is-playing')) {\n return;\n }\n\n const style = (containerRef.current as HTMLDivElement).style as any;\n style.webkitOverflowScrolling = style.webkitOverflowScrolling === 'auto' ? '' : 'auto';\n });\n });\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(container, lastItemElement, 'end', BOTTOM_FOCUS_MARGIN);\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n (!canPost || bottomOffset !== 'none') && 'bottom-padding',\n (bottomOffset !== 'none') && `bottom-padding-${bottomOffset}`,\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\n );\n\n return (\n
\n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : messageIds && !messageGroups ? (\n
{lang('NoMessages')}
\n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId?: number,\n threadFirstMessageId?: number,\n hasLinkedChat?: boolean,\n isSchedule = false,\n noAppearanceAnimation = false,\n) {\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const shouldRenderUnreadDivider = (\n (message.id === memoFirstUnreadIdRef.current && memoFirstUnreadIdRef.current !== threadFirstMessageId)\n || (message.id === threadTopMessageId && memoFirstUnreadIdRef.current === threadFirstMessageId)\n );\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n shouldRenderUnreadDivider && unreadDivider,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n
\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(dateGroup.datetime)}\n \n
\n {flatten(senderGroups)}\n \n );\n });\n\n return flatten(dateGroups);\n}\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n canPost: getCanPostInChat(chat, threadId),\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { getCanPostInChat } from '../../modules/helpers';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n canPost?: boolean;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n messageListType,\n canPost,\n unreadCount,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusLastMessage();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messsageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messsageElements[messsageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusLastMessage]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const canPost = chat && getCanPostInChat(chat, threadId);\n\n return {\n messageListType,\n canPost,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusLastMessage']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && input.tagName === 'INPUT' && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default DeleteMessageModalAsync;\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default AttachMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default SymbolMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionMenu = useModuleLoader(Bundles.Extra, 'MentionMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionMenu ? : undefined;\n};\n\nexport default MentionMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default CustomSendMenuAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default EmojiTooltipAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default BotKeyboardMenuAsync;\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default AttachmentModalAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default PollModalAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default DropAreaAsync;\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = /https?:\\/\\/(www.)?([a-zA-Z0-9.-]{2,256})([a-zA-Z/.-]{1,256})([?|#][=&#a-zA-Z0-9]{2,128})?/;\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n if (!webPagePreview || !messageText.length || noWebPage) {\n return undefined;\n }\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = webPagePreview;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default CalendarModalAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default PaymentModalAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default ReceiptModalAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED, IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionMenu from './hooks/useMentionMenu';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport MentionMenu from './MentionMenu.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n canSuggestMembers?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionMenuOpen, mentionFilter,\n closeMentionMenu, insertMention,\n mentionFilteredMembers,\n } = useMentionMenu(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isEmojiTooltipOpen, closeEmojiTooltip } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n return;\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n } else {\n setHtml(`${htmlRef.current!}${newHtml}`);\n }\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeEmojiTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionMenu();\n\n if (IS_MOBILE_SCREEN) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeEmojiTooltip, closeCalendar, closeMentionMenu, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_MOBILE_SCREEN || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(resetComposer);\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const lang = useLang();\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'Send message';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Posting media content is not allowed in this group.'\n : 'Record a voice message';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n {allowedAttachmentOptions.canAttachEmbedLinks && (\n \n )}\n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \n )}\n \n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed]);\n\n return {\n isEmojiTooltipOpen: hasStickers,\n closeEmojiTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default MobileSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default MessageSelectToolbarAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default UnpinAllMessagesModalAsync;\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_ENABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevForAnimation from '../../hooks/usePrevForAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n customBackground?: string;\n patternColor?: string;\n isCustomBackgroundColor?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n customBackground,\n patternColor,\n isCustomBackgroundColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState(false);\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n\n const renderingChatId = usePrevForAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevForAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevForAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevForAnimation(canPost, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n }, [chatId]);\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items).every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const customBackgroundValue = useCustomBackground(customBackground);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const className = buildClassName(\n hasTools && 'has-header-tools',\n customBackground && !isCustomBackgroundColor && 'custom-bg-image',\n customBackground && isCustomBackgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_ENABLED ? 'mask-image-enabled' : 'mask-image-disabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const lang = useLang();\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.PanelHidePinnedMessages')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { isBackgroundBlurred, customBackground, patternColor } = global.settings.byKey;\n\n const isCustomBackgroundColor = Boolean((customBackground || '').match(/^#[a-f\\d]{6,8}$/i));\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n if (!currentMessageList || !listIds.active) {\n return {\n customBackground,\n isBackgroundBlurred,\n isCustomBackgroundColor,\n };\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n\n return {\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: Boolean(pinnedIds && pinnedIds.length) || Boolean(audioChatId && audioMessageId),\n customBackground,\n patternColor,\n isCustomBackgroundColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\n ]),\n)(MiddleColumn));\n","import { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { useEffect, useState } from '../lib/teact/teact';\n\nexport default (settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, cacheApi.Type.Blob)\n .then((blob) => {\n setValue(`url(${URL.createObjectURL(blob)}`);\n });\n }\n }, [settingValue]);\n\n return value;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal.async';\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStatistics?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Statistics,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStatistics,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : isStatistics ? (\n HeaderContent.Statistics\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n \n \n \n \n );\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.Statistics:\n return

{lang('Statistics')}

;\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

{lang('Info')}

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n shouldSkipTransition && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n {!IS_MOBILE_SCREEN && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'searchMessagesByDate',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, getSortedUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return getSortedUserIds(groupChatMembers.map(({ userId }) => userId), usersById);\n }, [groupChatMembers, usersById]);\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberIds;\n getMore = undefined;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst UserExtra: FC = ({\n lastSyncTime, user, forceShowSelf, loadFullUser,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n\n useEffect(() => {\n if (lastSyncTime) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const lang = useLang();\n\n if (!user || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n const bio = fullInfo && fullInfo.bio;\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n\n return (\n
\n {bio && !!bio.length && (\n
\n \n
\n

{renderText(bio, ['br', 'links', 'emoji'])}

\n

{lang('UserBio')}

\n
\n
\n )}\n {username && !!username.length && (\n
\n \n
\n

{renderText(username)}

\n

{lang('Username')}

\n
\n
\n )}\n {formattedNumber && !!formattedNumber.length && (\n
\n \n
\n

{formattedNumber}

\n

{lang('Phone')}

\n
\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n\n return { lastSyncTime, user };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser']),\n)(UserExtra));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectChat } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserRightBanned,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport SafeLink from '../common/SafeLink';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n canInviteUsers?: boolean;\n};\n\nconst ChatExtra: FC = ({ chat, canInviteUsers }) => {\n const lang = useLang();\n\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const description = getChatDescription(chat);\n const link = getChatLink(chat);\n const url = link.indexOf('http') === 0 ? link : `http://${link}`;\n\n return (\n
\n {description && !!description.length && (\n
\n \n
\n

{renderText(description, ['br', 'links', 'emoji'])}

\n

{lang('Info')}

\n
\n
\n )}\n {canInviteUsers && !!link.length && (\n
\n \n
\n \n

{lang('SetUrlPlaceholder')}

\n
\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return { chat, canInviteUsers };\n },\n)(ChatExtra));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport { SHARED_MEDIA_SLICE, SLIDE_TRANSITION_DURATION } from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport UserExtra from './UserExtra';\nimport GroupExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const [activeTab, setActiveTab] = useState(0);\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = 'No documents found.';\n break;\n case 'links':\n text = 'No links found.';\n break;\n case 'audio':\n text = 'No audio found.';\n break;\n default:\n text = 'No media found.';\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n
\n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n
\n \n {renderSharedMedia}\n \n \n
\n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n {resolvedUserId ? (\n <>\n \n \n \n ) : (\n <>\n \n \n \n )}\n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector('.Transition');\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default RightSearchAsync;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default ManagementAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StatisticsAsync: FC = () => {\n const Statistics = useModuleLoader(Bundles.Extra, 'Statistics');\n\n return Statistics ? : ;\n};\n\nexport default StatisticsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default StickerSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default GifSearchAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default PollResultsAsync;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport Statistics from './Statistics.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n toggleStatistics,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStatistics = contentKey === RightColumnContent.Statistics;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback(() => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo();\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined });\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Statistics:\n toggleStatistics();\n break;\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, toggleStatistics, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n case RightColumnContent.Statistics:\n return ;\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'toggleStatistics',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default NotificationsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default ErrorsAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default ForwardPickerAsync;\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport { ANIMATION_END_DELAY, DEBUG } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasErrors: boolean;\n audioMessage?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst APP_NAME = 'Telegram';\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n loadAnimatedEmojis,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n loadAnimatedEmojis();\n }\n }, [lastSyncTime, loadAnimatedEmojis]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = APP_NAME;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n document.title = APP_NAME;\n updateIcon(false);\n });\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasErrors: Boolean(global.errors.length),\n audioMessage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadAnimatedEmojis']),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.413c0f1376b6d9916861.css b/dist/4.66638f18ab54b35d4ce9.css similarity index 100% rename from dist/4.413c0f1376b6d9916861.css rename to dist/4.66638f18ab54b35d4ce9.css diff --git a/dist/4.413c0f1376b6d9916861.js b/dist/4.66638f18ab54b35d4ce9.js similarity index 92% rename from dist/4.413c0f1376b6d9916861.js rename to dist/4.66638f18ab54b35d4ce9.js index 3e68f3237..d82c5fb83 100644 --- a/dist/4.413c0f1376b6d9916861.js +++ b/dist/4.66638f18ab54b35d4ce9.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{102:function(e,t,n){"use strict";var r=n(37);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},106:function(e,t,n){"use strict";var r=n(0),a=n(7),o=n(9),c=n(8),i=n(43),l=n(125);let u,s;async function d(){return u||(u=n.e(7).then(n.bind(null,180)),s=(await u).default),u}setTimeout(d,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:u,playSegment:f,speed:m,noLoop:h,size:b,quality:p,isLowPriority:v,onLoad:g})=>{const[E,j]=Object(r.r)(),O=Object(r.q)(null),y=Object(r.q)(!1),w=Object(r.q)(!1),k=Object(r.q)();k.current=u;const N=Object(r.q)();N.current=f,Object(r.n)(()=>{if(E||!n)return;const e=()=>{if(!O.current)return;const e=new s(t,O.current,n,{noLoop:h,size:b,quality:p,isLowPriority:v},g);m&&e.setSpeed(m),j(e)};s?e():d().then(()=>{Object(o.b)(()=>{O.current&&e()})})},[E,n,t,v,h,g,p,b,m]),Object(r.n)(()=>()=>{E&&E.destroy()},[E]);const C=Object(r.m)((e=!1)=>{E&&(k.current||N.current)&&(N.current?E.playSegment(N.current):e?E.goToAndPlay(0):E.play())},[E]),L=Object(r.m)(()=>{E&&E.pause()},[E]),A=Object(r.m)(()=>{w.current=!0,E&&(y.current||(y.current=E.isPlaying()),L())},[E,L]),M=Object(r.m)(()=>{y.current&&C(),y.current=!1,w.current=!1},[C]),P=Object(r.m)(()=>{Object(o.b)(M)},[M]);Object(r.n)(()=>{E&&(u||f?w.current?y.current=!0:C(h):w.current?y.current=!1:L())},[E,u,f,h,C,L]),Object(i.a)(A,M),Object(l.a)(A,P);const T=Object(c.a)("AnimatedSticker",e,a.d&&u&&"is-playing"),S=b?`width: ${b}px; height: ${b}px;`:void 0;return r.a.createElement("div",{ref:O,className:T,style:S})})},114:function(e,t,n){"use strict";var r=n(0),a=n(57);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},116:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(48);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},120:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(14),i=n(93),l=n(31),u=n(98),s=n(16);n(141);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let f,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new f(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.o&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(5),n.e(8)]).then(n.bind(null,303)),f=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(142);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},125:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},126:function(e,t,n){},138:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(116),i=n(106);n(126);const l=[0,50],u=[0,20],s=[20,0],d=o.f?a.kb:a.jb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[f,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{f||Object(c.a)("MonkeyPeek").then(m)},[f]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.ub:d,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),f&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.ub:d,className:p?"shown":"hidden",animationData:f,playSegment:e?u:s,noLoop:!0}))})},139:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(31);const l=o.f?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:u,placeholder:s="Password",submitLabel:d="Next",clearError:f,onChangePasswordVisibility:m,onInputChange:h,onSubmit:b})=>{const p=Object(r.q)(null),[v,g]=Object(r.r)(""),[E,j]=Object(r.r)(!1);return Object(r.n)(()=>{o.k||setTimeout(()=>{p.current.focus()},l)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{p.current.focus(),p.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&b(v)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",v&&"touched",n&&"error")},r.a.createElement("input",{ref:p,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){n&&f();const{target:t}=e;g(t.value),j(t.value.length>=a.U),h&&h(t.value)}}),r.a.createElement("label",null,n||u||s),r.a.createElement("div",{className:"toggle-password",onClick:function(){m(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&r.a.createElement(i.a,{type:"submit",ripple:!0,isLoading:e},d))})},140:function(e,t,n){},141:function(e,t,n){},142:function(e,t,n){},92:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return b})),n.d(t,"AuthPassword",(function(){return g})),n.d(t,"AuthRegister",(function(){return O})),n.d(t,"AuthQrCode",(function(){return C}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(39),l=n(16),u=n(1),s=n(116),d=n(106);n(126);const f=o.f?u.kb:u.jb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(d.a,{id:"idleMonkey",size:o?u.ub:f,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(d.a,{id:"trackingMonkey",size:o?u.ub:f,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))});function h(e){function t(){e()}return window.addEventListener("popstate",t),window.history.pushState({},""),()=>{window.removeEventListener("popstate",t),window.history.back()}}var b=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s})=>{const d=Object(r.q)(null),[f,b]=Object(r.r)(""),[p,v]=Object(r.r)(!1),[g,E]=Object(r.r)(1);Object(r.n)(()=>{o.k||d.current.focus()},[]),h(u);const j=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==f&&(b(t.value),p?t.value.length||v(!1):v(!0),f&&f.length>t.value.length?E(-1):E(1),5===t.value.length&&c({code:t.value}))},[a,s,f,p,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:f,codeLength:5,isTracking:p,trackingDirection:g}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:u,role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:d,id:"sign-in-code",label:"Code",onInput:j,value:f,error:a,autoComplete:"one-time-code",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),p=n(138),v=n(139);var g=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(p.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(v.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),E=n(31),j=n(120);var O=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[d,f]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:d,lastName:m}),u&&o({file:u})}},r.a.createElement(j.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;f(n.value),l(n.value.length>0)},value:d,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let y=null;class w{}w.render=function(e,t){y(e,t)},self.QrCreator=w,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};y=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||d<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||d<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function l(e,n){for(var c=d=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:d-15+l][8]=h,s[8][8>l?d-l-1:9>l?15-l:14-l]=h;if(s[d-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+d-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+d-8-3][Math.floor(l/3)]=h}if(null==f){for(e=o.I(a,u),c=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),l=0;l8*h)throw Error("code length overflow. ("+c.f()+">"+8*h+")");for(c.f()+4<=8*h&&c.put(0,4);0!=c.f()%8;)c.m(!1);for(;!(c.f()>=8*h)&&(c.put(236,8),!(c.f()>=8*h));)c.put(17,8);var E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||d<=l){l-=c,c=-c;break}}}var u=n[c],s=null,d=0,f=null,m=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||d<=e||0>t||d<=t)throw Error(e+","+t);return s[e][t]},h:function(){return d},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=a.g(o.c(0))-a.g(e.c(0)),r=Array(o.b()),c=0;cr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n})=>{const a=Object(r.q)(null);return Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=a.current;n.innerHTML="",n.classList.remove("pre-animate"),k.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]),h(n),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(N.a)("qr-container",t&&"pre-animate"),ref:a},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(E.a,{isText:!0,onClick:n},"Log in by phone number")))}))},93:function(e,t,n){"use strict";var r=n(11),a=n(29),o=n(102);t.a=()=>{const e=Object(a.a)();return Object(o.a)(()=>r.a(e),[e]),r.b}},98:function(e,t,n){"use strict";var r=n(0),a=n(50);var o=n(8),c=n(43),i=n(27),l=n(52),u=n(93),s=n(31),d=n(114);n(140);t.a=e=>{const{title:t,className:n,isOpen:f,header:m,hasCloseButton:h,noBackdrop:b,children:p,onClose:v,onCloseAnimationEnd:g,onEnter:E}=e,{shouldRender:j,transitionClassNames:O}=Object(i.a)(f,g),y=Object(r.q)(null);Object(r.n)(()=>f?Object(a.a)({onEsc:v,onEnter:E}):void 0,[f,v,E]),Object(r.n)(()=>f&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[f]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&Object(c.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[f]);const w=Object(u.a)();if(!j)return;const k=Object(o.a)("Modal",n,O,b&&"transparent-backdrop");return r.a.createElement(d.a,null,r.a.createElement("div",{ref:y,className:k,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:v}),r.a.createElement("div",{className:"modal-dialog"},m||(t?r.a.createElement("div",{className:"modal-header"},h&&r.a.createElement(s.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:w("Close"),onClick:v},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}}}]); -//# sourceMappingURL=4.413c0f1376b6d9916861.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{103:function(e,t,n){"use strict";var r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},107:function(e,t,n){"use strict";var r=n(0),a=n(7),o=n(9),c=n(8),i=n(44),l=n(126);let u,s;async function d(){return u||(u=n.e(7).then(n.bind(null,181)),s=(await u).default),u}setTimeout(d,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:u,playSegment:f,speed:m,noLoop:h,size:b,quality:p,isLowPriority:v,onLoad:g})=>{const[E,j]=Object(r.r)(),O=Object(r.q)(null),y=Object(r.q)(!1),w=Object(r.q)(!1),k=Object(r.q)();k.current=u;const N=Object(r.q)();N.current=f,Object(r.n)(()=>{if(E||!n)return;const e=()=>{if(!O.current)return;const e=new s(t,O.current,n,{noLoop:h,size:b,quality:p,isLowPriority:v},g);m&&e.setSpeed(m),j(e)};s?e():d().then(()=>{Object(o.b)(()=>{O.current&&e()})})},[E,n,t,v,h,g,p,b,m]),Object(r.n)(()=>()=>{E&&E.destroy()},[E]);const C=Object(r.m)((e=!1)=>{E&&(k.current||N.current)&&(N.current?E.playSegment(N.current):e?E.goToAndPlay(0):E.play())},[E]),L=Object(r.m)(()=>{E&&E.pause()},[E]),A=Object(r.m)(()=>{w.current=!0,E&&(y.current||(y.current=E.isPlaying()),L())},[E,L]),M=Object(r.m)(()=>{y.current&&C(),y.current=!1,w.current=!1},[C]),P=Object(r.m)(()=>{Object(o.b)(M)},[M]);Object(r.n)(()=>{E&&(u||f?w.current?y.current=!0:C(h):w.current?y.current=!1:L())},[E,u,f,h,C,L]),Object(i.a)(A,M),Object(l.a)(A,P);const T=Object(c.a)("AnimatedSticker",e,a.d&&u&&"is-playing"),S=b?`width: ${b}px; height: ${b}px;`:void 0;return r.a.createElement("div",{ref:O,className:T,style:S})})},115:function(e,t,n){"use strict";var r=n(0),a=n(58);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},117:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(49);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},121:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(14),i=n(94),l=n(32),u=n(99),s=n(16);n(142);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let f,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new f(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.o&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(5),n.e(8)]).then(n.bind(null,304)),f=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(143);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},126:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},127:function(e,t,n){},139:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(117),i=n(107);n(127);const l=[0,50],u=[0,20],s=[20,0],d=o.f?a.kb:a.jb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[f,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{f||Object(c.a)("MonkeyPeek").then(m)},[f]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.ub:d,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),f&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.ub:d,className:p?"shown":"hidden",animationData:f,playSegment:e?u:s,noLoop:!0}))})},140:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(32);const l=o.f?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:u,placeholder:s="Password",submitLabel:d="Next",clearError:f,onChangePasswordVisibility:m,onInputChange:h,onSubmit:b})=>{const p=Object(r.q)(null),[v,g]=Object(r.r)(""),[E,j]=Object(r.r)(!1);return Object(r.n)(()=>{o.k||setTimeout(()=>{p.current.focus()},l)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{p.current.focus(),p.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&b(v)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",v&&"touched",n&&"error")},r.a.createElement("input",{ref:p,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){n&&f();const{target:t}=e;g(t.value),j(t.value.length>=a.U),h&&h(t.value)}}),r.a.createElement("label",null,n||u||s),r.a.createElement("div",{className:"toggle-password",onClick:function(){m(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&r.a.createElement(i.a,{type:"submit",ripple:!0,isLoading:e},d))})},141:function(e,t,n){},142:function(e,t,n){},143:function(e,t,n){},93:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return b})),n.d(t,"AuthPassword",(function(){return g})),n.d(t,"AuthRegister",(function(){return O})),n.d(t,"AuthQrCode",(function(){return C}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(40),l=n(16),u=n(1),s=n(117),d=n(107);n(127);const f=o.f?u.kb:u.jb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(d.a,{id:"idleMonkey",size:o?u.ub:f,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(d.a,{id:"trackingMonkey",size:o?u.ub:f,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))});function h(e){function t(){e()}return window.addEventListener("popstate",t),window.history.pushState({},""),()=>{window.removeEventListener("popstate",t),window.history.back()}}var b=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s})=>{const d=Object(r.q)(null),[f,b]=Object(r.r)(""),[p,v]=Object(r.r)(!1),[g,E]=Object(r.r)(1);Object(r.n)(()=>{o.k||d.current.focus()},[]),h(u);const j=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==f&&(b(t.value),p?t.value.length||v(!1):v(!0),f&&f.length>t.value.length?E(-1):E(1),5===t.value.length&&c({code:t.value}))},[a,s,f,p,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:f,codeLength:5,isTracking:p,trackingDirection:g}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:u,role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:d,id:"sign-in-code",label:"Code",onInput:j,value:f,error:a,autoComplete:"one-time-code",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),p=n(139),v=n(140);var g=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(p.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(v.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),E=n(32),j=n(121);var O=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[d,f]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:d,lastName:m}),u&&o({file:u})}},r.a.createElement(j.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;f(n.value),l(n.value.length>0)},value:d,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let y=null;class w{}w.render=function(e,t){y(e,t)},self.QrCreator=w,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};y=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||d<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||d<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function l(e,n){for(var c=d=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:d-15+l][8]=h,s[8][8>l?d-l-1:9>l?15-l:14-l]=h;if(s[d-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+d-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+d-8-3][Math.floor(l/3)]=h}if(null==f){for(e=o.I(a,u),c=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),l=0;l8*h)throw Error("code length overflow. ("+c.f()+">"+8*h+")");for(c.f()+4<=8*h&&c.put(0,4);0!=c.f()%8;)c.m(!1);for(;!(c.f()>=8*h)&&(c.put(236,8),!(c.f()>=8*h));)c.put(17,8);var E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||d<=l){l-=c,c=-c;break}}}var u=n[c],s=null,d=0,f=null,m=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||d<=e||0>t||d<=t)throw Error(e+","+t);return s[e][t]},h:function(){return d},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=a.g(o.c(0))-a.g(e.c(0)),r=Array(o.b()),c=0;cr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n})=>{const a=Object(r.q)(null);return Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=a.current;n.innerHTML="",n.classList.remove("pre-animate"),k.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]),h(n),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(N.a)("qr-container",t&&"pre-animate"),ref:a},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(E.a,{isText:!0,onClick:n},"Log in by phone number")))}))},94:function(e,t,n){"use strict";var r=n(11),a=n(29),o=n(103);t.a=()=>{const e=Object(a.a)();return Object(o.a)(()=>r.a(e),[e]),r.b}},99:function(e,t,n){"use strict";var r=n(0),a=n(51);var o=n(8),c=n(44),i=n(27),l=n(53),u=n(94),s=n(32),d=n(115);n(141);t.a=e=>{const{title:t,className:n,isOpen:f,header:m,hasCloseButton:h,noBackdrop:b,children:p,onClose:v,onCloseAnimationEnd:g,onEnter:E}=e,{shouldRender:j,transitionClassNames:O}=Object(i.a)(f,g),y=Object(r.q)(null);Object(r.n)(()=>f?Object(a.a)({onEsc:v,onEnter:E}):void 0,[f,v,E]),Object(r.n)(()=>f&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[f]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&Object(c.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[f]);const w=Object(u.a)();if(!j)return;const k=Object(o.a)("Modal",n,O,b&&"transparent-backdrop");return r.a.createElement(d.a,null,r.a.createElement("div",{ref:y,className:k,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:v}),r.a.createElement("div",{className:"modal-dialog"},m||(t?r.a.createElement("div",{className:"modal-header"},h&&r.a.createElement(s.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:w("Close"),onClick:v},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}}}]); +//# sourceMappingURL=4.66638f18ab54b35d4ce9.js.map \ No newline at end of file diff --git a/dist/4.413c0f1376b6d9916861.js.map b/dist/4.66638f18ab54b35d4ce9.js.map similarity index 99% rename from dist/4.413c0f1376b6d9916861.js.map rename to dist/4.66638f18ab54b35d4ce9.js.map index 0ddf75c2f..1be236f19 100644 --- a/dist/4.413c0f1376b6d9916861.js.map +++ b/dist/4.66638f18ab54b35d4ce9.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/hooks/useOnChange.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx","webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/hooks/useLang.ts","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts"],"names":["cb","dependencies","prevDeps","usePrevious","some","d","i","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","onLoad","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","IS_IOS","style","undefined","ref","Portal","containerId","children","elementRef","document","createElement","useLayoutEffect","querySelector","element","classList","add","appendChild","TeactDOM","render","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","getAnimationData","name","path","replace","window","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","type","format","circle","Croppie","croppiePromise","cropper","file","onChange","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","error","initCropper","ensureCroppie","lang","useLang","Modal","isOpen","Boolean","title","hasCloseButton","Loading","Button","round","color","onClick","result","croppedImg","blobToFile","ariaLabel","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","role","tabIndex","event","target","files","value","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","addEventListener","removeEventListener","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","IS_MOBILE_SCREEN","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","isPasswordVisible","isBig","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","FOCUS_DELAY_TIMEOUT_MS","isLoading","hint","placeholder","submitLabel","clearError","onChangePasswordVisibility","onInputChange","onSubmit","inputRef","password","setPassword","canSubmit","setCanSubmit","IS_TOUCH_ENV","focus","requestAnimationFrame","select","action","preventDefault","autoComplete","e","length","MIN_PASSWORD_LENGTH","ripple","code","codeLength","trackingDirection","isTracking","idleMonkeyData","setIdleMonkeyData","trackingMonkeyData","setTrackingMonkeyData","TRACKING_FRAMES_PER_SYMBOL","AnimatedSticker","startFrame","endFrame","getTrackingFrames","useHistoryBack","handler","handlePopState","history","pushState","back","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","setCode","setIsTracking","setTrackingDirection","onCodeChange","currentTarget","substr","InputText","label","onInput","inputMode","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","PasswordForm","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","method","AvatarEditable","G","H","w","B","self","QrCreator","t","c","a","b","h","u","J","r","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","clearRect","Array","put","push","write","j","o","s","S","multiply","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","innerHTML","remove","token","isText","forceUpdate","useForceUpdate","useOnChange","langProvider","props","header","noBackdrop","onCloseAnimationEnd","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","handleKeyDown","key","stopPropagation","focusableElements","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","toggle","dispatchHeavyAnimationEvent"],"mappings":"0FAAA,YAEe,KAA0BA,EAAwBC,KAC/D,MAAMC,EAAWC,YAAeF,GAC3BC,IAAYD,EAAaG,KAAK,CAACC,EAAGC,IAAMD,IAAMH,EAASI,KAE1DN,EAAGE,GAAY,M,iCCNnB,iDA0BA,IAAIK,EACAC,EAKJC,eAAeC,IAMb,OALKH,IACHA,EAAgB,8BAChBC,SAAiBD,GAAsBI,SAGlCJ,EAGTK,WAAWF,EAXe,KAqLXG,gBAxKuB,EACpCC,YACAC,KACAC,gBACAC,OACAC,cACAC,QACAC,SACAC,OACAC,UACAC,gBACAC,aAEA,MAAOC,EAAWC,GAAgBC,cAE5BC,EAAYC,YAAuB,MACnCC,EAAaD,aAAO,GACpBE,EAAWF,aAAO,GAElBG,EAAUH,cAChBG,EAAQC,QAAUhB,EAClB,MAAMiB,EAAiBL,cACvBK,EAAeD,QAAUf,EAEzBiB,YAAU,KACR,GAAIV,IAAcT,EAChB,OAGF,MAAMoB,EAAO,KACX,IAAKR,EAAUK,QACb,OAGF,MAAMI,EAAe,IAAI7B,EACvBO,EACAa,EAAUK,QACVjB,EACA,CACEI,SACAC,OACAC,UACAC,iBAEFC,GAGEL,GACFkB,EAAaC,SAASnB,GAGxBO,EAAaW,IAGX7B,EACF4B,IAEA1B,IAAe6B,KAAK,KAClBC,YAAQ,KACFZ,EAAUK,SACZG,SAKP,CAACX,EAAWT,EAAeD,EAAIQ,EAAeH,EAAQI,EAAQF,EAASD,EAAMF,IAEhFgB,YAAU,IACD,KACDV,GACFA,EAAUgB,WAGb,CAAChB,IAEJ,MAAMiB,EAAgBC,YAAY,CAACC,GAAgB,KAC7CnB,IAAcO,EAAQC,SAAWC,EAAeD,WAC9CC,EAAeD,QACjBR,EAAUP,YAAYgB,EAAeD,SAC5BW,EACTnB,EAAUoB,YAAY,GAEtBpB,EAAUR,SAGb,CAACQ,IAEEqB,EAAiBH,YAAY,KAC5BlB,GAILA,EAAUsB,SACT,CAACtB,IAEEuB,EAAkBL,YAAY,KAClCZ,EAASE,SAAU,EAEdR,IAIAK,EAAWG,UACdH,EAAWG,QAAUR,EAAUwB,aAGjCH,MACC,CAACrB,EAAWqB,IAETI,EAAoBP,YAAY,KAChCb,EAAWG,SACbS,IAGFZ,EAAWG,SAAU,EACrBF,EAASE,SAAU,GAClB,CAACS,IAEES,EAAyBR,YAAY,KACzCH,YAAQU,IACP,CAACA,IAEJf,YAAU,KACHV,IAIDR,GAAQC,EACNa,EAASE,QACXH,EAAWG,SAAU,EAErBS,EAActB,GAIZW,EAASE,QACXH,EAAWG,SAAU,EAErBa,MAGH,CAACrB,EAAWR,EAAMC,EAAaE,EAAQsB,EAAeI,IAEzDM,YAAuBJ,EAAiBE,GAIxCG,YAAkBL,EAAiBG,GAEnC,MAAMG,EAAgBC,YACpB,kBACAzC,EAEA0C,KAAUvC,GAAQ,cAGdwC,EAAQpC,EAAQ,UAASA,gBAAmBA,YAAYqC,EAE9D,OACE,yBACEC,IAAK/B,EACLd,UAAWwC,EAEXG,MAAOA,O,iCC9Mb,mBAkCeG,IAzBc,EAAGC,cAAa/C,YAAWgD,eACtD,MAAMC,EAAalC,YAAOmC,SAASC,cAAc,QAqBjD,OAnBAC,YAAgB,KACd,MAAMtC,EAAYoC,SAASG,cAA8BN,GAAe,YACxE,IAAKjC,EACH,OAGF,MAAMwC,EAAUL,EAAW9B,QAO3B,OANInB,GACFsD,EAAQC,UAAUC,IAAIxD,GAGxBc,EAAU2C,YAAYH,GAEf,KACLI,IAASC,YAAOf,EAAWU,GAC3BxC,EAAU8C,YAAYN,KAEvB,CAACtD,EAAW+C,IAERW,IAASC,OAAOX,EAAUC,EAAW9B,W,sFCZvC,MAAM0C,EAA0B,CACrCC,WCpBa,IAA0B,gEDqBvCC,eErBa,IAA0B,oEFsBvCC,YGtBa,IAA0B,iEHuBvCC,WIvBa,IAA0B,gEJwBvCC,WKxBa,IAA0B,kDLyBvCC,WMzBa,IAA0B,kDN0BvCC,iBO1Ba,IAA0B,8DP6B1B,SAASC,EAAiBC,GACvC,MAAMC,EAAOV,EAAwBS,GAAME,QAAQC,OAAOC,SAASC,OAAQ,IAE3E,OAAOC,IAAmB,OAAML,EAAQM,iBAAeC,U,yGQjBzD,MAAMC,EAAiE,CACrEC,KAAM,OACNxE,QAAS,GACTyE,OAAQ,OACRC,QAAQ,GAIV,IAAIC,EACAC,EAWAC,EAgGWtF,kBAxDiB,EAAGuF,OAAMC,WAAUC,cACjD,MAAOC,EAAgBC,GAAqB7E,aAAS,GAErDQ,YAAU,KACHiE,IAIAG,EA9CT9F,eAA2BgG,GACzB,IACE,MAAMC,EAAgB1C,SAAS2C,eAAe,eAC9C,IAAKD,EACH,OAGF,MAAM,YAAEE,EAAF,aAAeC,GAAiBH,EAEtCP,EAAU,IAAIF,EAAQS,EAAe,CACnCI,YAAY,EACZC,SAAU,CACRC,MAAOJ,EACPK,OAAQJ,GAEVK,SAAU,CACRF,MAAOJ,EAAc,GACrBK,OAAQJ,EAAe,GACvBf,KAAM,YAIV,MAAMqB,QAAgBC,YAAcX,SAC9BN,EAAQkB,KAAK,CAAEC,IAAKH,IAC1B,MAAOI,GACHC,KAEFC,QAAQC,MAAMH,IAyBhBI,CAAYvB,GA/DhB3F,iBAME,OALKyF,IACHA,EAAiB,oDACjBD,SAAiBC,GAAgBvF,SAG5BuF,EAoDH0B,GAAgBrF,KAAK,IAAMiE,GAAkB,MAM9C,CAACJ,EAAMG,IAEV,MAAMsB,EAAOC,cAab,OACE,kBAACC,EAAA,EAAD,CACEC,OAAQC,QAAQ7B,GAChBE,QAASA,EACT4B,MAAM,qBACNpH,UAAU,YACVqH,gBAAc,GAEb5B,EACC,yBAAKxF,GAAG,gBAER,kBAACqH,EAAA,EAAD,MAEF,kBAACC,EAAA,EAAD,CACEvH,UAAU,iBACVwH,OAAK,EACLC,MAAM,UACNC,QA5BN/H,iBACE,IAAK0F,EACH,OAGF,MAAMsC,QAA8BtC,EAAQsC,OAAO5C,GAC7C6C,EAA+B,iBAAXD,EAAsBA,EAASE,YAAWF,EAAQ,cAE5EpC,EAASqC,IAqBLE,UAAWf,EAAK,cAEhB,uBAAG/G,UAAU,mB,OC3CND,gBAhEsB,EACnCqH,QAAQ,8BACRW,WACAC,uBACAzC,eAEA,MAAO0C,EAAcC,GAAmBrH,eACjCsH,EAAgBC,GAAqBvH,YAA6BmH,GAEzE3G,YAAU,KACR+G,EAAkBJ,IACjB,CAACA,IA2BJ,MAAMK,EAAiB5F,YACrB0F,GAAkB,SAClBJ,GAAY,YAGd,OACE,yBAAK/H,UAAU,kBACb,2BACEA,UAAWqI,EACXC,KAAK,SACLC,SAAU,EACVnB,MAAOA,GAEP,2BACEpC,KAAK,OACLO,SAxCR,SAA0BiD,GACxB,MAAMC,EAASD,EAAMC,OAEhBA,GAAWA,EAAOC,OAAUD,EAAOC,MAAM,KAI9CR,EAAgBO,EAAOC,MAAM,IAC7BD,EAAOE,MAAQ,KAiCTC,OAAO,0BAET,uBAAG5I,UAAU,oBACZmI,GAAkB,yBAAKU,IAAKV,EAAgBW,IAAI,YAEnD,kBAAC,EAAD,CAAWxD,KAAM2C,EAAczC,QAzBnC,WACE0C,OAAgBtF,IAwB4C2C,SAnC9D,SAA0BqC,GACxBM,OAAgBtF,GAChB2C,EAASqC,GAELO,GACFY,IAAIC,gBAAgBb,GAEtBC,EAAkBW,IAAIE,gBAAgBrB,W,iCCjD1C,WAEe,KACbsB,EACAC,KAEA9H,YAAU,KACH6B,SAASkG,YACZF,IAGFzE,OAAO4E,iBAAiB,OAAQH,GAChCzE,OAAO4E,iBAAiB,QAASF,GAE1B,KACL1E,OAAO6E,oBAAoB,QAASH,GACpC1E,OAAO6E,oBAAoB,OAAQJ,KAEpC,CAACA,EAAQC,M,uDClBd,kDAiBA,MACMI,EAAuC,CAAC,EAAG,IAC3CC,EAAwC,CAAC,EAAG,IAC5CC,EAAsC,CAAC,GAAI,GAC3CC,EAAeC,IAAmBC,KAA2BC,KAsDpD9J,gBApDsB,EAAG+J,oBAAmBC,YACzD,MAAOC,EAAiBC,GAAsBpJ,eACvCqJ,EAAgBC,GAAqBtJ,eACrCuJ,EAAqBC,GAA0BxJ,aAAS,IACxDyJ,EAAaC,GAAkB1J,aAAS,GAE/CQ,YAAU,KACH2I,EAGHlK,WAAW,IAAMyK,GAAe,GAhBP,KAczBlG,YAAiB,eAAe5C,KAAKwI,IAItC,CAACD,IAEJ3I,YAAU,KACH6I,GACH7F,YAAiB,cAAc5C,KAAK0I,IAErC,CAACD,IAEJ,MAAMM,EAAwB3I,YAAY,IAAMwI,GAAuB,GAAO,IAE9E,OACE,yBAAKpK,GAAG,SAASD,UAAW+J,EAAQ,MAAQ,KACxCK,GACA,yBAAKpK,UAAU,mBAEhBgK,GACC,kBAAC,IAAD,CACE/J,GAAG,cACHM,KAAMwJ,EAAQU,KAAsBf,EACpC1J,UAAWsK,EAAc,SAAW,QACpCpK,cAAe8J,EACf5J,YAAamJ,EACbjJ,QAAM,EACNI,OAAQ8J,IAGXN,GACC,kBAAC,IAAD,CACEjK,GAAG,aACHM,KAAMwJ,EAAQU,KAAsBf,EACpC1J,UAAWsK,EAAc,QAAU,SACnCpK,cAAegK,EACf9J,YAAa0J,EAAoBN,EAAsBC,EACvDnJ,QAAM,Q,iCCnEhB,wCAuBA,MAAMoK,EAAyBf,IAAmB,IAAM,IAkGzC5J,gBAhGoB,EACjC4K,aAAY,EACZb,oBACAlD,QACAgE,OACAC,cAAc,WACdC,cAAc,OACdC,aACAC,6BACAC,gBACAC,eAGA,MAAMC,EAAWpK,YAAyB,OAEnCqK,EAAUC,GAAexK,YAAS,KAClCyK,EAAWC,GAAgB1K,aAAS,GAgD3C,OA9CAQ,YAAU,KACHmK,KACH1L,WAAW,KACTqL,EAAShK,QAASsK,SACjBf,IAEJ,IAEHrJ,YAAU,KACJuF,GACF8E,sBAAsB,KACpBP,EAAShK,QAASsK,QAClBN,EAAShK,QAASwK,YAGrB,CAAC/E,IAgCF,0BAAMgF,OAAO,GAAGV,SAblB,SAAsB1C,GACpBA,EAAMqD,iBAEFlB,GAIAW,GACFJ,EAASE,IAK6BU,aAAa,OACnD,yBAAK9L,UAAWyC,YAAe,6BAA8B2I,GAAY,UAAWxE,GAAS,UAC3F,2BACE/D,IAAKsI,EACLnL,UAAU,eACVgF,KAAM8E,EAAoB,OAAS,WACnC7J,GAAG,mBACH0I,MAAOyC,GAAY,GACnBU,aAAa,mBACbvG,SAvCR,SAA0BwG,GACpBnF,GACFmE,IAGF,MAAM,OAAEtC,GAAWsD,EACnBV,EAAY5C,EAAOE,OACnB4C,EAAa9C,EAAOE,MAAMqD,QAAUC,KAChChB,GACFA,EAAcxC,EAAOE,UAgCnB,+BAAQ/B,GAASgE,GAAQC,GACzB,yBACE7K,UAAU,kBACV0H,QA/BR,WACEsD,GAA4BlB,IA+BtBxB,KAAK,SACLC,SAAU,EACVnB,MAAM,8BAEN,uBAAGpH,UAAW8J,EAAoB,WAAa,sBAGlDwB,GACC,kBAAC,IAAD,CAAQtG,KAAK,SAASkH,QAAM,EAACvB,UAAWA,GACrCG,O,uWC/FX,MAEMpB,EAAeC,IAAmBC,KAA2BC,KA+EpD9J,kBA7EsB,EACnCoM,OACAC,aACAC,oBACAC,aACAvC,YAEA,MAAOwC,EAAgBC,GAAqB3L,eACrC4L,EAAoBC,GAAyB7L,eAC7CuJ,EAAqBC,GAA0BxJ,aAAS,GACzD8L,EAA6B,IAA8CP,EAEjF/K,YAAU,KACHkL,GACHlI,YAAiB,cAAc5C,KAAK+K,IAErC,CAACD,IAEJlL,YAAU,KACHoL,GACHpI,YAAiB,kBAAkB5C,KAAKiL,IAEzC,CAACD,IAEJ,MAAMjC,EAAwB3I,YAAY,IAAMwI,GAAuB,GAAO,IAuB9E,OACE,yBAAKpK,GAAG,SAASD,UAAW+J,EAAQ,MAAQ,KACxCK,GACA,yBAAKpK,UAAU,mBAEhBuM,GACC,kBAACK,EAAA,EAAD,CACE3M,GAAG,aACHM,KAAMwJ,EAAQU,KAAsBf,EACpC1J,UAAWsM,EAAa,cAAW1J,EACnC1C,cAAeqM,EACfpM,MAAOmM,EACP5L,OAAQ8J,IAGXiC,GACC,kBAACG,EAAA,EAAD,CACE3M,GAAG,iBACHM,KAAMwJ,EAAQU,KAAsBf,EACpC1J,UAAYsM,EAAwB,QAAX,SACzBpM,cAAeuM,EACfrM,YAAakM,EA1CrB,WACE,MAAMO,EAAcV,GAAQA,EAAKH,OAAS,GAAMK,EAAoB,EA/B3C,GAgCEM,GAA8BR,EAAKH,OAAS,GACnE,EACEc,EAAWX,EAAKH,SAAWI,EAjCV,IADE,GAoCEO,EAA6BR,EAAKH,OAE7D,OAAIK,EAAoB,EACf,CACLS,EACAD,GAIG,CACLA,EACAC,GAyB8BC,QAAsBnK,EAChDvC,MAAO,EACPC,QAAM,OC5FD,SAAS0M,EAAeC,GACrC,SAASC,IACPD,IAMF,OAHAxI,OAAO4E,iBAAiB,WAAY6D,GACpCzI,OAAO0I,QAAQC,UAAU,GAAI,IAEtB,KACL3I,OAAO6E,oBAAoB,WAAY4D,GACvCzI,OAAO0I,QAAQE,QC2GJtN,kBAAKuN,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,kBAAmB,mBAAoB,gBAAiB,cAC9F,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,cAAe,0BAA2B,mBAF9EJ,CAnG6B,EAC/CK,kBAAiBC,mBAAkBC,gBAAeC,YAAWC,cAAaC,0BAAyBC,qBAGnG,MAAM9C,EAAWpK,YAAyB,OAEnCoL,EAAM+B,GAAWrN,YAAiB,KAClCyL,EAAY6B,GAAiBtN,aAAS,IACtCwL,EAAmB+B,GAAwBvN,YAAS,GAE3DQ,YAAU,KACHmK,KACHL,EAAShK,QAASsK,SAEnB,IAEHuB,EAAegB,GAEf,MAAMK,EAAexM,YAAakK,IAC5B+B,GACFG,IAGF,MAAQK,cAAe7F,GAAWsD,EAClCtD,EAAOE,MAAQF,EAAOE,MAAMnE,QAAQ,SAAU,IAAI+J,OAAO,EA1BzC,GA4BZ9F,EAAOE,QAAUwD,IAIrB+B,EAAQzF,EAAOE,OAEV2D,EAEO7D,EAAOE,MAAMqD,QACvBmC,GAAc,GAFdA,GAAc,GAKZhC,GAAQA,EAAKH,OAASvD,EAAOE,MAAMqD,OACrCoC,GAAsB,GAEtBA,EAAqB,GA3CP,IA8CZ3F,EAAOE,MAAMqD,QACf+B,EAAY,CAAE5B,KAAM1D,EAAOE,UAE5B,CAACmF,EAAWG,EAAgB9B,EAAMG,EAAYyB,IAEjD,OACE,yBAAK9N,GAAG,iBAAiBD,UAAU,iBACjC,yBAAKA,UAAU,aACb,kBAAC,EAAD,CACEmM,KAAMA,EACNC,WAxDU,EAyDVE,WAAYA,EACZD,kBAAmBA,IAErB,4BACGsB,EACD,yBACE3N,UAAU,mBACV0H,QAASsG,EACT1F,KAAK,SACLC,SAAU,EACVnB,MAAM,qCAEN,uBAAGpH,UAAU,gBAGjB,uBAAGA,UAAU,QACV4N,EACC,gFAEE,6BAFF,yBAKA,8DAEE,6BAFF,mBAMJ,kBAACY,EAAA,EAAD,CACE3L,IAAKsI,EACLlL,GAAG,eACHwO,MAAM,OACNC,QAASL,EACT1F,MAAOwD,EACPvF,MAAOkH,EACPhC,aAAa,gBACb6C,UAAU,YAEXd,GAAiB,kBAACvG,EAAA,EAAD,W,kBC9DXvH,kBAAKuN,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,gBAAiB,YAAa,aACpE,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,kBAAmB,mBAFvDJ,CApCiC,EACnDO,gBAAeC,YAAWc,WAAUC,kBAAiBZ,qBAErD,MAAOa,EAAcC,GAAmBlO,aAAS,GAE3CmO,EAAiCnN,YAAaoN,IAClDF,EAAgBE,IACf,IAEGC,EAAerN,YAAauJ,IAChCyD,EAAgB,CAAEzD,cACjB,CAACyD,IAEJ,OACE,yBAAK5O,GAAG,qBAAqBD,UAAU,iBACrC,yBAAKA,UAAU,aACb,kBAAC,IAAD,CAAgB8J,kBAAmBgF,IACnC,mDACA,uBAAG9O,UAAU,QAAb,iCAEE,6BAFF,2BAIA,kBAACmP,EAAA,EAAD,CACEpE,WAAYkD,EACZrH,MAAOkH,EACPlD,KAAMgE,EACNjE,UAAWkD,EACX/D,kBAAmBgF,EACnB9D,2BAA4BgE,EAC5B9D,SAAUgE,S,iBCwCLnP,kBAAKuN,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,gBAAiB,cACvD,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,SAAU,iBAAkB,uBAFhEJ,CArEiC,EACnDO,gBAAeC,YAAWsB,SAAQnB,iBAAgBoB,yBAElD,MAAOC,EAAeC,GAAoB1O,aAAS,IAC5C2O,EAAaC,GAAkB5O,eAC/B6O,EAAWC,GAAgB9O,YAAS,KACpC+O,EAAUC,GAAehP,YAAS,IA6BzC,OACE,yBAAKZ,GAAG,yBAAyBD,UAAU,iBACzC,yBAAKA,UAAU,aACb,0BAAM4L,OAAO,GAAGkE,OAAO,OAAO5E,SAbpC,SAAsB1C,GACpBA,EAAMqD,iBAENuD,EAAO,CAAEM,YAAWE,aAEhBJ,GACFH,EAAmB,CAAE/J,KAAMkK,MAQvB,kBAACO,EAAA,EAAD,CAAgBxK,SAAUkK,IAC1B,yCACA,uBAAGzP,UAAU,QAAb,0BAEE,6BAFF,sBAIA,kBAACwO,EAAA,EAAD,CACEvO,GAAG,0BACHwO,MAAM,OACNlJ,SAxCV,SAA+BiD,GACzBsF,GACFG,IAGF,MAAM,OAAExF,GAAWD,EAEnBmH,EAAalH,EAAOE,OACpB4G,EAAiB9G,EAAOE,MAAMqD,OAAS,IAiC/BrD,MAAO+G,EACP9I,MAAOkH,EACPhC,aAAa,eAEf,kBAAC0C,EAAA,EAAD,CACEvO,GAAG,yBACHwO,MAAM,uBACNlJ,SArCV,SAA8BiD,GAC5B,MAAM,OAAEC,GAAWD,EAEnBqH,EAAYpH,EAAOE,QAmCXA,MAAOiH,EACP9D,aAAa,gBAEdwD,GACC,kBAAC/H,EAAA,EAAD,CAAQvC,KAAK,SAASkH,QAAM,EAACvB,UAAWkD,GAAxC,yBC1EC,IAAImC,EAAE,KAAK,MAAMC,GAAGA,EAAEtM,OAAO,SAASuM,EAAEC,GAAGH,EAAEE,EAAEC,IAAIC,KAAKC,UAAUJ,EAC/E,SAAUC,GAAG,SAASC,EAAEG,EAAEC,EAAEC,EAAEzE,GAAG,IAAI0E,EAAE,GAAGC,EAAER,EAAEM,EAAED,GAAGG,EAAEC,EAAEL,GAAGI,EAAEE,IAAI7E,EAAEA,GAAG,EAAE,IAAI8E,EAAEH,EAAEA,IAAInR,EAAEmR,EAAEA,IAAI,EAAE3E,EAA4G,OAA1G0E,EAAEK,KAAKR,EAAEG,EAAEM,MAAMR,EAAEE,EAAEO,QAAQR,EAAEC,EAAEQ,EAAE1R,EAAEkR,EAAED,EAAE,SAASC,EAAED,GAAa,OAALA,GAAGzE,IAAS,GAAjB0E,GAAG1E,IAAmB0E,GAAGI,GAAG,EAAEL,GAAGA,GAAGK,IAAKH,EAAEF,EAAEC,EAAED,IAAWC,EAAE,SAASS,EAAEZ,EAAEC,EAAEC,EAAEzE,EAAE0E,EAAEC,EAAEG,EAAEtR,EAAE4R,EAAEC,GAAG,SAAST,EAAEF,EAAED,EAAEa,EAAEd,EAAEhR,EAAEsR,EAAEM,GAAGV,GAAGH,EAAEgB,OAAOd,EAAEK,EAAEQ,EAAEF,GAAGb,EAAEiB,MAAMf,EAAEa,EAAEd,EAAEhR,EAAEmR,IAAIJ,EAAEgB,OAAOd,EAAEa,GAAGR,EAAEP,EAAEkB,OAAOjB,EAAEG,EAAEF,GAAGF,EAAEkB,OAAOjB,EAAEC,GAAGG,EAAEpR,EAAEwM,EAAEyE,EAAEzE,EAAE0E,GAAGC,EAAE,GAAGC,EAAEQ,EAAEpF,EAAE0E,EAAEF,EAAEE,EAAE,GAAGC,GAAGC,EAAES,EAAEb,EAAEE,EAAEF,EAAEC,EAAEE,EAAE,GAAGC,EAAEE,EAAEN,EAAEC,EAAEzE,EAAEyE,EAAE,EAAEE,GAAG,SAASe,EAAEnB,EAAEC,EAAEC,EAAEzE,EAAE0E,EAAEC,EAAEG,EAAEtR,EAAE4R,EAAEC,GAAG,SAAST,EAAEF,EAAED,EAAED,EAAEhR,GAAG+Q,EAAEkB,OAAOf,EAAEF,EAAEC,GAAGF,EAAEgB,OAAOb,EACtfD,GAAGF,EAAEgB,OAAOb,EAAED,EAAEjR,GAAG+Q,EAAEiB,MAAMd,EAAED,EAAEC,EAAEF,EAAEC,EAAEE,GAAGG,GAAGF,EAAEJ,EAAEC,EAAEE,EAAEA,GAAGnR,GAAGoR,EAAE5E,EAAEyE,GAAGE,EAAEA,GAAGS,GAAGR,EAAE5E,EAAE0E,GAAGC,GAAGA,GAAGU,GAAGT,EAAEJ,EAAEE,EAAEC,GAAGA,GAAmX,SAASgB,EAAEpB,EAAEC,GAAGC,EAAE,CAAC,IAAIA,EAAED,EAAEO,KAAK/E,EACpfwE,EAAEoB,EAAElB,EAAEF,EAAEqB,EAAElB,EAAEH,EAAEsB,EAAEhB,EAAEN,EAAEuB,EAAqB,IAAnBrB,EAAEsB,KAAKC,IAAI,EAAEvB,GAAG,GAAOC,EAAEqB,KAAKE,IAAI,GAAGvB,GAAG,IAAID,GAAGC,EAAED,GAAG,EAAE,IAAI,IAAIlR,EAAE4Q,EAAEK,EAAEzE,EAAE0E,EAAEI,GAAG,MAAML,EAAE,MAAMI,IAAIrR,OAAE,EAAO,IAAIA,EAAE,OAAO,KAAyI,IAApIiR,EAAEF,EAAE4B,WAAW,MAAM3B,EAAE4B,aAAa3B,EAAE4B,UAAU7B,EAAE4B,WAAW3B,EAAE6B,SAAS9B,EAAE+B,KAAK/B,EAAEgC,IAAIhC,EAAEhQ,KAAKgQ,EAAEhQ,OAAOwL,EAAExM,EAAE0R,EAAEP,EAAEH,EAAEhQ,KAAKwL,EAAEyE,EAAEgC,YAAgB3B,EAAE,EAAEA,EAAE9E,EAAE8E,GAAG,EAAE,IAAIJ,EAAE,EAAEA,EAAE1E,EAAE0E,GAAG,EAAE,CAAC,IAAIU,EAAEX,EAAEY,EAAEb,EAAE+B,KAAK7B,EAAEC,EAAEC,EAAEJ,EAAEgC,IAAI1B,EAAEH,EAAE+B,EAAE5B,EAAE6B,EAAEjC,EAAEY,EAAE9R,EAAEiR,EAAEmC,EAAEvB,EAAEV,EAAEkC,EAAEjC,EAAED,EAAEmC,EAAEJ,EAAE,EAAEK,EAAEL,EAAE,EAAEM,EAAEL,EAAE,EAAEM,EAAEN,EAAE,EAAEhB,EAAEK,KAAKkB,MAAMlB,KAAKE,IAAI,GAAGF,KAAKC,IAAI,EAAEzB,EAAE2C,IAAIxC,GAAGiB,EAAEN,EAAEoB,EAAEC,GAAGS,EAAE9B,EAAEwB,EAAEE,GAAG7C,EAAEmB,EAAEwB,EAAEH,GAAGG,EAAExB,EAAEwB,EAAEG,GAAG,IAAII,EAAE/B,EAAEoB,EAAEO,GAAGA,EAAE3B,EAAEyB,EAAEE,GAAGN,EAAErB,EAAEyB,EACnfJ,GAAGI,EAAEzB,EAAEyB,EAAEC,GAAGN,EAAEpB,EAAEoB,EAAEM,GAAG3B,EAAEW,KAAKvK,MAAM4J,GAAGT,EAAEoB,KAAKvK,MAAMmJ,GAAGgC,EAAEZ,KAAKvK,MAAMmL,GAAGC,EAAEb,KAAKvK,MAAMoL,GAAGjB,EAAET,EAAEC,EAAEC,EAAET,EAAEgC,EAAEC,EAAElB,GAAGxB,IAAIuC,GAAGvC,IAAIkD,GAAGV,IAAIU,GAAGV,IAAID,GAAGhB,EAAEN,EAAEC,EAAET,EAAEgC,EAAEC,EAAElB,EAAExB,GAAGuC,GAAGU,EAAEjD,GAAGkD,GAAGP,EAAEH,GAAGU,GAAGJ,EAAEN,GAAGD,GAAGK,GAAmB,OAF7F,SAAWxC,EAAEC,GAAG,IAAIC,EAAED,EAAE8C,KAAK,GAAG,iBAAkB7C,EAAEF,EAAE8B,UAAU5B,MAAM,CAAC,IAAIzE,EAAEyE,EAAExL,KAAKyL,EAAED,EAAE8C,WAAuD,GAA5C9C,EAAEA,EAAE+C,SAASC,IAAK/C,GAAIsB,KAAKvK,MAAMiJ,EAAEF,EAAEhQ,OAAU,oBAAoBwL,EAAE,IAAI2E,EAAEJ,EAAEmD,qBAAqBC,MAAMpD,EAAEE,OAAQ,IAAG,oBAAoBzE,EAA2C,MAAM4H,MAAM,oBAArDjD,EAAEJ,EAAEsD,qBAAqBF,MAAMpD,EAAEE,GAAwCC,EAAEoD,QAAQ,EAAEpD,EAAED,MAAME,EAAEoD,aAAarD,EAAED,KAAKF,EAAE8B,UAAU1B,GAEhSqD,CAAEvD,EAAED,GAAGC,EAAE6C,OAAc/C,EAAE,IAAIqB,EAAE,CAACqC,WAAW,EAAEC,WAAW,GAAGC,QAAQ,IAAI5B,KAAK,EAAEC,IAAI,EAAEhS,KAAK,IAAI8S,KAAK,OAAOlB,WAAW,KAAKrB,KAAK,UAAUqD,OAAO,GAAGC,MAAM,GAAGpE,EAAE,SAASM,EAAEC,GAAG,IAAIC,EAAE,GAAG6D,OAAOC,OAAO9D,EAAEmB,EAAErB,GAAGE,EAAEoB,EAAEpB,EAAEwD,WAAWxD,EAAEqB,EAAErB,EAAEyD,WAAWzD,EAAEmB,EAAEnB,EAAE0D,QAAQ1D,EAAE8B,KAAK9B,EAAE8B,KAAK9B,EAAE+B,IAAI/B,EAAE+B,IAAI/B,EAAEjQ,KAAKiQ,EAAEjQ,KAAKiQ,EAAE6C,KAAK7C,EAAE6C,KAAK7C,EAAE2B,WAAW3B,EAAE2B,WAC/e3B,EAAEM,KAAKN,EAAEM,KAAKN,EAAE0C,EAAE1C,EAAE2D,OAAO3D,EAAEsB,EAAEtB,EAAE4D,MAAS7D,aAAagE,mBAAsBhE,EAAErK,QAAQsK,EAAEjQ,MAAMgQ,EAAEpK,SAASqK,EAAEjQ,OAAKgQ,EAAErK,MAAMsK,EAAEjQ,KAAKgQ,EAAEpK,OAAOqK,EAAEjQ,MAAKgQ,EAAE2B,WAAW,MAAMsC,UAAU,EAAE,EAAEjE,EAAErK,MAAMqK,EAAEpK,QAAQuL,EAAEnB,EAAEC,MAAQF,EAAEpN,SAASC,cAAc,WAAY+C,MAAMsK,EAAEjQ,KAAK+P,EAAEnK,OAAOqK,EAAEjQ,KAAKiQ,EAAEkB,EAAEpB,EAAEE,GAAGD,EAAE9M,YAAY+M,KAJxS,CAI8S,WACjE,SAASU,EAAEX,EAAEC,GAAG,SAASzE,EAAE0E,EAAEC,GAAG,IAAI,IAAIF,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,MAAM,GAAGC,EAAED,GAAGjR,GAAGkR,EAAED,GAAG,IAAI,IAAID,GAAG,EAAE,GAAGA,EAAEA,GAAG,GAAG,GAAGG,EAAEH,GAAGhR,GAAGmR,EAAEH,IAAIM,EAAEJ,EAAED,GAAGE,EAAEH,GAAG,GAAGC,GAAG,GAAGA,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,IAAI,GAAGC,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,GAAG,GAAGD,GAAG,GAAGA,GAAS,SAASE,EAAEA,EAAED,GAAG,IAAI,IAAIa,EAAE9R,EAAE,EAAEgR,EAAE,GAAGoC,EAAE8B,MAAMpD,GAAGuB,EAAE,EAAEA,EACnfvB,EAAEuB,GAAG,EAAE,CAACD,EAAEC,GAAG6B,MAAMpD,GAAG,IAAI,IAAIoB,EAAE,EAAEA,EAAEpB,EAAEoB,GAAG,EAAEE,EAAEC,GAAGH,GAAG,KAA2C,IAAtC5B,EAAE8B,EAAE5G,EAAE,EAAE,GAAGA,EAAExM,EAAE,EAAE,GAAGwM,EAAE,EAAExM,EAAE,GAAG8R,EAAEK,EAAE1B,EAAEO,GAAOoC,EAAE,EAAEA,EAAEtB,EAAErF,OAAO2G,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEvB,EAAErF,OAAO4G,GAAG,EAAE,CAACH,EAAEpB,EAAEsB,GAAG,IAAID,EAAErB,EAAEuB,GAAG,GAAG,MAAM/B,EAAE4B,GAAGC,GAAG,IAAI,IAAIK,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIC,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAEnC,EAAE4B,EAAEM,GAAGL,EAAEM,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGC,GAAG,GAAGA,GAAG,GAAGD,GAAG,GAAGC,EAAE,IAAI3B,EAAE,EAAEA,EAAE9R,EAAE,EAAE8R,GAAG,EAAE,MAAMR,EAAEQ,GAAG,KAAKR,EAAEQ,GAAG,GAAG,GAAGA,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAE9R,EAAE,EAAE8R,GAAG,EAAE,MAAMR,EAAE,GAAGQ,KAAKR,EAAE,GAAGQ,GAAG,GAAGA,EAAE,GAAiB,IAAdA,EAAEK,EAAExB,EAAEQ,GAAG,EAAEF,GAAOmC,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGnC,GAAG,IAAIY,GAAGsB,EAAE,GAAG9B,EAAE,EAAE8B,EAAEA,EAAE,EAAEA,EAAEA,EAAE,EAAEpT,EAAE,GAAGoT,GAAG,GAAGC,EAAE/B,EAAE,GAAG,EAAE8B,EAAEpT,EAAEoT,EAAE,EAAE,EAAEA,EAAE,GAAGA,EAAE,GAAGA,GAAGC,EAAe,GAAb/B,EAAEtR,EAAE,GAAG,IAAIkR,EAAK,GACtfF,EAAE,CAAU,IAATc,EAAEK,EAAEqC,EAAExD,GAAOoC,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGnC,GAAG,IAAIY,GAAGsB,EAAE,GAAG9B,EAAEkB,KAAKkB,MAAMN,EAAE,IAAIA,EAAE,EAAEpT,EAAE,EAAE,GAAGqT,EAAE,IAAID,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGnC,GAAG,IAAIY,GAAGsB,EAAE,GAAG9B,EAAE8B,EAAE,EAAEpT,EAAE,EAAE,GAAGwS,KAAKkB,MAAMN,EAAE,IAAIC,EAAE,GAAG,MAAMzB,EAAE,CAAkB,IAAjBV,EAAEH,EAAE6C,EAAE5C,EAAEG,GAAGW,EAHmS,WAAa,IAAId,EAAE,GAAGC,EAAE,EAAEzE,EAAE,CAACoE,EAAE,WAAW,OAAOI,GAC/fA,EAAE,SAASE,GAAG,OAAO,IAAIF,EAAEwB,KAAKkB,MAAMxC,EAAE,MAAM,EAAEA,EAAE,EAAE,IAAIiE,IAAI,SAASjE,EAAEC,GAAG,IAAI,IAAIF,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAEzE,EAAE6G,EAAE,IAAInC,IAAIC,EAAEF,EAAE,EAAE,KAAKa,EAAE,WAAW,OAAOb,GAAGoC,EAAE,SAASnC,GAAG,IAAIC,EAAEqB,KAAKkB,MAAMzC,EAAE,GAAGD,EAAEvE,QAAQ0E,GAAGH,EAAEoE,KAAK,GAAGlE,IAAIF,EAAEG,IAAI,MAAMF,EAAE,GAAGA,GAAG,IAAI,OAAOzE,EAE9DoE,GAAQwC,EAAE,EAAEA,EAAEvB,EAAEpF,OAAO2G,GAAG,EAAEC,EAAExB,EAAEuB,GAAGtB,EAAEqD,IAAI,EAAE,GAAGrD,EAAEqD,IAAI9B,EAAEnC,IAAIiB,EAAEL,EAAE,EAAEd,IAAIqC,EAAEgC,MAAMvD,GAAG,IAAIsB,EAAEC,EAAE,EAAED,EAAElC,EAAEzE,OAAO2G,GAAG,EAAEC,GAAGnC,EAAEkC,GAAGkC,EAAE,GAAGxD,EAAEA,IAAI,EAAEuB,EAAE,MAAMe,MAAM,0BAA0BtC,EAAEA,IAAI,IAAI,EAAEuB,EAAE,KAAK,IAAIvB,EAAEA,IAAI,GAAG,EAAEuB,GAAGvB,EAAEqD,IAAI,EAAE,GAAG,GAAGrD,EAAEA,IAAI,GAAGA,EAAEuB,GAAE,GAAI,OAAOvB,EAAEA,KAAK,EAAEuB,KAAKvB,EAAEqD,IAAI,IAAI,KAAMrD,EAAEA,KAAK,EAAEuB,KAAQvB,EAAEqD,IAAI,GAAG,GAAG,IAAI/D,EAAE,EAC7c,IAD+ciC,EAAED,EAAE,EAAEF,EAAEgC,MAAMhE,EAAEzE,QACjf0G,EAAE+B,MAAMhE,EAAEzE,QAAY+G,EAAE,EAAEA,EAAEtC,EAAEzE,OAAO+G,GAAG,EAAE,CAAC,IAAIpB,EAAElB,EAAEsC,GAAG8B,EAAE3E,EAAEO,EAAEsC,GAAG+B,EAAEnD,EAAgD,IAA9CgB,EAAEZ,KAAKC,IAAIW,EAAEhB,GAAGiB,EAAEb,KAAKC,IAAIY,EAAE1C,GAAGuC,EAAEM,GAAG0B,MAAM9C,GAAOqB,EAAE,EAAEA,EAAEP,EAAEM,GAAG/G,OAAOgH,GAAG,EAAEP,EAAEM,GAAGC,GAAG,IAAI3B,EAAElB,IAAI6C,EAAErC,GAA4D,IAAzDA,GAAGgB,EAAEqB,EAAEtB,EAAER,EAAEhB,GAAGyB,EAAEF,EAAEgB,EAAEM,GAAGC,EAAEvC,IAAI,GAAGuC,EAAEA,GAAGN,EAAEK,GAAG0B,MAAMzB,EAAEvC,IAAI,GAAOuC,EAAE,EAAEA,EAAEN,EAAEK,GAAG/G,OAAOgH,GAAG,EAAE9C,EAAE8C,EAAErB,EAAElB,IAAIiC,EAAEK,GAAG/G,OAAO0G,EAAEK,GAAGC,GAAG,GAAG9C,EAAEyB,EAAEpB,EAAEL,GAAG,EAAE,IAAI8C,EAAE3B,EAAE,EAAE2B,EAAEvC,EAAEzE,OAAOgH,GAAG,EAAE3B,GAAGZ,EAAEuC,GAAG8B,EAAa,IAAXzD,EAAEoD,MAAMpD,GAAO2B,EAAErC,EAAE,EAAEqC,EAAEL,EAAEK,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEtC,EAAEzE,OAAO+G,GAAG,EAAEC,EAAEP,EAAEM,GAAG/G,SAASqF,EAAEV,GAAG8B,EAAEM,GAAGC,GAAGrC,GAAG,GAAG,IAAIqC,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEtC,EAAEzE,OAAO+G,GAAG,EAAEC,EAAEN,EAAEK,GAAG/G,SAASqF,EAAEV,GAAG+B,EAAEK,GAAGC,GAAGrC,GAAG,GAAGQ,EAAEE,EACpd,IADsdZ,EAAEU,EAAEE,GACnf,EAAEsB,EAAEpT,EAAE,EAAEqT,EAAE,EAAEH,EAAE,EAAEjC,EAAEkB,EAAE0B,EAAE5C,GAAOkC,EAAEnT,EAAE,EAAE,EAAEmT,EAAEA,GAAG,EAAE,IAAI,GAAGA,KAAKA,IAAI,CAAC,IAAIK,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,MAAMlC,EAAE8B,GAAGD,EAAEK,KAAKC,GAAE,EAAGP,EAAEhC,EAAEzE,SAASgH,EAAE,IAAIvC,EAAEgC,KAAKG,EAAE,IAAIpC,EAAEmC,EAAED,EAAEK,KAAKC,GAAGA,GAAGnC,EAAE8B,GAAGD,EAAEK,GAAGC,GAAO,KAAHJ,IAAUH,GAAG,EAAEG,EAAE,IAAS,GAAG,GAARD,GAAGtB,IAAU9R,GAAGoT,EAAE,CAACA,GAAGtB,EAAEA,GAAGA,EAAE,QAAQ,IAAIX,EAAEqD,EAAEvD,GAAGK,EAAE,KAAKtR,EAAE,EAAE4R,EAAE,KAAKC,EAAE,GAAGT,EAAE,CAACA,EAAE,SAASF,GAAGA,EALuC,SAAWF,GAAG,IAAIC,EAAEU,EAAE6D,EAAExE,GAAG,MAAM,CAACyE,EAAE,WAAW,OAAO,GAAGvE,EAAE,WAAW,OAAOD,EAAExE,QAAQ4I,MAAM,SAASrE,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAED,EAAExE,OAAOyE,GAAG,EAAEF,EAAEmE,IAAIlE,EAAEC,GAAG,KAKrLP,CAAEO,GAAGW,EAAEuD,KAAKlE,GAAGU,EAAE,MAAMX,EAAE,SAASC,EAAED,GAAG,GAAG,EAAEC,GAAGlR,GAAGkR,GAAG,EAAED,GAAGjR,GAAGiR,EAAE,MAAMmD,MAAMlD,EAAE,IAAID,GAAG,OAAOK,EAAEJ,GAAGD,IAAIE,EAAE,WAAW,OAAOnR,GAAGqR,EAAE,WAAW,IAAI,IAAIJ,EAAE,EAAEE,EAAE,EAAEH,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,CAACE,GAAE,EAAGF,GAAG,IAAIhR,EAAEmS,EAAEmB,EAAElC,IAAM,GAAGJ,GAAGC,EAAEjR,KAAEiR,EAAEjR,EAAEmR,EAAEH,GAAEE,GAAE,EAAGC,KAAK,OAAOC,EACrf,SAASc,EAAElB,EAAEC,GAAG,QAAG,IAAoBD,EAAEvE,OAAO,MAAM2H,MAAMpD,EAAEvE,OAAO,IAAIwE,GAAG,IAAIzE,EAAE,WAAW,IAAI,IAAI0E,EAAE,EAAEA,EAAEF,EAAEvE,QAAQ,GAAGuE,EAAEE,IAAIA,GAAG,EAAE,IAAI,IAAII,EAAE4D,MAAMlE,EAAEvE,OAAOyE,EAAED,GAAGjR,EAAE,EAAEA,EAAEgR,EAAEvE,OAAOyE,EAAElR,GAAG,EAAEsR,EAAEtR,GAAGgR,EAAEhR,EAAEkR,GAAG,OAAOI,EAAxH,GAA6HJ,EAAE,CAACF,EAAE,SAASE,GAAG,OAAO1E,EAAE0E,IAAIA,EAAE,WAAW,OAAO1E,EAAEC,QAAQiJ,SAAS,SAASzE,GAAG,IAAI,IAAIE,EAAE+D,MAAMhE,EAAEA,IAAID,EAAEC,IAAI,GAAGF,EAAE,EAAEA,EAAEE,EAAEA,IAAIF,GAAG,EAAE,IAAI,IAAIY,EAAE,EAAEA,EAAEX,EAAEC,IAAIU,GAAG,EAAET,EAAEH,EAAEY,IAAIQ,EAAEnS,EAAEmS,EAAER,EAAEV,EAAEF,EAAEA,IAAIoB,EAAER,EAAEX,EAAED,EAAEY,KAAK,OAAOM,EAAEf,EAAE,IAAIsC,EAAE,SAASxC,GAAG,GAAG,EAAEC,EAAEA,IAAID,EAAEC,IAAI,OAAOA,EAAE,IAAI,IAAIF,EAAEoB,EAAER,EAAEV,EAAEF,EAAE,IAAIoB,EAAER,EAAEX,EAAED,EAAE,IAAIG,EAAE+D,MAAMhE,EAAEA,KACjfU,EAAE,EAAEA,EAAEV,EAAEA,IAAIU,GAAG,EAAET,EAAES,GAAGV,EAAEF,EAAEY,GAAG,IAAIA,EAAE,EAAEA,EAAEX,EAAEC,IAAIU,GAAG,EAAET,EAAES,IAAIQ,EAAEnS,EAAEmS,EAAER,EAAEX,EAAED,EAAEY,IAAIZ,GAAG,OAAOkB,EAAEf,EAAE,GAAGsC,EAAExC,KAAK,OAAOC,EAAES,EAAE6D,EAAE,SAASxE,GAAG,IAAI,IAAIC,EAAE,GAAGzE,EAAE,EAAEA,EAAEwE,EAAEvE,OAAOD,IAAI,CAAC,IAAI0E,EAAEF,EAAE2E,WAAWnJ,GAAG,IAAI0E,EAAED,EAAEmE,KAAKlE,GAAG,KAAKA,EAAED,EAAEmE,KAAK,IAAIlE,GAAG,EAAE,IAAM,GAAFA,GAAM,MAAMA,GAAG,OAAOA,EAAED,EAAEmE,KAAK,IAAIlE,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO1E,IAAI0E,EAAE,QAAU,KAAFA,IAAS,GAAmB,KAAhBF,EAAE2E,WAAWnJ,IAASyE,EAAEmE,KAAK,IAAIlE,GAAG,GAAG,IAAIA,GAAG,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO,OAAOD,GAAG,IAAIuD,EAAE,CAACoB,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEpF,EAAE,GAAGyB,EAAE,WAAW,SAASnB,EAAEE,GAAG,IAAI,IAAID,EAAE,EAAE,GAAGC,GAAGD,GAAG,EAAEC,KAAK,EAAE,OAAOD,EAAE,IAAIA,EAAE,CAAC,GAAG,CAAC,EAAE,IACjf,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KACjf,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAGyE,MAHjE,CAACN,EAAE,SAASO,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGF,EAAEC,GAAGD,EAAE,OAAOC,GAAG,MAAMD,EAAEC,GAAGD,EAAE,MAAM,OAAgB,OAATE,GAAG,GAAGD,IAAUuD,EAAE,SAAStD,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGF,EAAEC,GAAGD,EAAE,OAAOC,GAAG,MAAMD,EAAEC,GAAGD,EAAE,MAAM,OAAOE,GAAG,GAAGD,GAAGR,EAAE,SAASS,GAAG,OAAOD,EAAEC,EAAE,IAAI2C,EAAE,SAAS3C,GAAG,OAAOA,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,IAAIC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IACnfC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIuB,KAAKkB,MAAMxC,EAAE,GAAGsB,KAAKkB,MAAMzC,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,GAAGC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,GAAGC,EAAED,GAAG,GAAG,GAAG,QAAQ,MAAMmD,MAAM,mBAAmBlD,KAAMS,EAAE,SAAST,GAAG,IAAI,IAAID,EAAEiB,EAAE,CAAC,GAAG,GAAGlB,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAEC,EAAEA,EAAEyE,SAASxD,EAAE,CAAC,EAAEE,EAAEnS,EAAE+Q,IAAI,IAAI,OAAOC,GAAGa,EAAE,SAASZ,EAAED,GAAG,GAAG,GAAGC,GAAG,EAAED,GAAG,GAAGA,EAAE,MAAMmD,MAAM,SAASlD,EAAE,WAAWD,GAAG,OAAO,GAAGA,EAAE,EAAE,IAAIqC,EAAE,SAASpC,GAAG,IAAI,IAAID,EAAEC,EAAEC,IAAIH,EAAE,EACpfhR,EAAE,EAAEA,EAAEiR,EAAEjR,GAAG,EAAE,IAAI,IAAI4R,EAAE,EAAEA,EAAEX,EAAEW,GAAG,EAAE,CAAC,IAAI,IAAIpF,EAAE,EAAEuE,EAAEG,EAAED,EAAEjR,EAAE4R,GAAGsB,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,KAAK,EAAElT,EAAEkT,GAAGjC,GAAGjR,EAAEkT,GAAG,IAAI,IAAIC,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,EAAEvB,EAAEuB,GAAGlC,GAAGW,EAAEuB,IAAI,GAAGD,GAAG,GAAGC,IAAIpC,GAAGG,EAAED,EAAEjR,EAAEkT,EAAEtB,EAAEuB,KAAK3G,GAAG,GAAG,EAAEA,IAAIwE,GAAG,EAAExE,EAAE,GAAG,IAAIxM,EAAE,EAAEA,EAAEiR,EAAE,EAAEjR,GAAG,EAAE,IAAI4R,EAAE,EAAEA,EAAEX,EAAE,EAAEW,GAAG,EAAKpF,EAAE,EAAE0E,EAAED,EAAEjR,EAAE4R,KAAKpF,GAAG,GAAG0E,EAAED,EAAEjR,EAAE,EAAE4R,KAAKpF,GAAG,GAAG0E,EAAED,EAAEjR,EAAE4R,EAAE,KAAKpF,GAAG,GAAG0E,EAAED,EAAEjR,EAAE,EAAE4R,EAAE,KAAKpF,GAAG,IAAG,GAAGA,GAAG,GAAGA,KAAEwE,GAAG,GAAE,IAAIhR,EAAE,EAAEA,EAAEiR,EAAEjR,GAAG,EAAE,IAAI4R,EAAE,EAAEA,EAAEX,EAAE,EAAEW,GAAG,EAAEV,EAAED,EAAEjR,EAAE4R,KAAKV,EAAED,EAAEjR,EAAE4R,EAAE,IAAIV,EAAED,EAAEjR,EAAE4R,EAAE,IAAIV,EAAED,EAAEjR,EAAE4R,EAAE,IAAIV,EAAED,EAAEjR,EAAE4R,EAAE,KAAKV,EAAED,EAAEjR,EAAE4R,EAAE,IAAIV,EAAED,EAAEjR,EAAE4R,EAAE,KAAKZ,GAAG,IAAI,IAAIY,EAAE,EAAEA,EAAEX,EAAEW,GAAG,EAAE,IAAI5R,EAAE,EAAEA,EAAEiR,EAAE,EAAEjR,GAAG,EAAEkR,EAAED,EAAEjR,EAAE4R,KAAKV,EAAED,EAAEjR,EACrf,EAAE4R,IAAIV,EAAED,EAAEjR,EAAE,EAAE4R,IAAIV,EAAED,EAAEjR,EAAE,EAAE4R,IAAIV,EAAED,EAAEjR,EAAE,EAAE4R,KAAKV,EAAED,EAAEjR,EAAE,EAAE4R,IAAIV,EAAED,EAAEjR,EAAE,EAAE4R,KAAKZ,GAAG,IAAI,IAAIY,EAAEpF,EAAE,EAAEoF,EAAEX,EAAEW,GAAG,EAAE,IAAI5R,EAAE,EAAEA,EAAEiR,EAAEjR,GAAG,EAAEkR,EAAED,EAAEjR,EAAE4R,KAAKpF,GAAG,GAAG,OAAOwE,EAAGwB,KAAKuD,IAAI,IAAIvJ,EAAEyE,EAAEA,EAAE,IAAI,EAAE,KALiQ,GAKhPmB,EAAE,WAAW,IAAI,IAAIpB,EAAEkE,MAAM,KAAKjE,EAAEiE,MAAM,KAAK1I,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAEwE,EAAExE,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAEwE,EAAExE,GAAGwE,EAAExE,EAAE,GAAGwE,EAAExE,EAAE,GAAGwE,EAAExE,EAAE,GAAGwE,EAAExE,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAEyE,EAAED,EAAExE,IAAIA,EAAE,MAAM,CAACoF,EAAE,SAASV,GAAG,GAAG,EAAEA,EAAE,MAAMkD,MAAM,QAAQlD,EAAE,KAAK,OAAOD,EAAEC,IAAIjR,EAAE,SAASiR,GAAG,KAAK,EAAEA,GAAGA,GAAG,IAAI,KAAK,KAAKA,GAAGA,GAAG,IAAI,OAAOF,EAAEE,KAArR,GAA6RH,EAAE,WAAW,SAASC,EAAEE,EAAEF,GAAG,OAAOA,GAAG,KAAKwD,EAAEoB,EAAE,OAAO3E,EAAE,GAC3gBC,EAAE,IAAI,KAAKsD,EAAEqB,EAAE,OAAO5E,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKsD,EAAEsB,EAAE,OAAO7E,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKsD,EAAE9D,EAAE,OAAOO,EAAE,GAAGC,EAAE,GAAG,IAAI,IAAID,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAClf,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GA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","file":"4.413c0f1376b6d9916861.js","sourcesContent":["import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_IOS } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName(\n 'AnimatedSticker',\n className,\n // Workaround for an iOS bug when animated stickers sometimes disappear\n IS_IOS && play && 'is-playing',\n );\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n
\n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [idleMonkeyData, setIdleMonkeyData] = useState>();\n const [trackingMonkeyData, setTrackingMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n useEffect(() => {\n if (!idleMonkeyData) {\n getAnimationData('MonkeyIdle').then(setIdleMonkeyData);\n }\n }, [idleMonkeyData]);\n\n useEffect(() => {\n if (!trackingMonkeyData) {\n getAnimationData('MonkeyTracking').then(setTrackingMonkeyData);\n }\n }, [trackingMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {idleMonkeyData && (\n \n )}\n {trackingMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(TrackingMonkey);\n","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nexport default function useHistoryBack(handler: NoneToVoidFunction) {\n function handlePopState() {\n handler();\n }\n\n window.addEventListener('popstate', handlePopState);\n window.history.pushState({}, '');\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.history.back();\n };\n}\n","import { FormEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [code, setCode] = useState('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n const onCodeChange = useCallback((e: FormEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n
\n
\n \n

\n {authPhoneNumber}\n \n \n

\n \n

\n {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\n

\n \n {authIsLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']),\n)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint, setAuthPassword, clearAuthError,\n}) => {\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n
\n
\n \n

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']),\n)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto,\n}) => {\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n function handleFirstNameChange(event: ChangeEvent) {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }\n\n function handleLastNameChange(event: ChangeEvent) {\n const { target } = event;\n\n setLastName(target.value);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n
\n
\n
\n \n

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\n \n \n {isButtonShown && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']),\n)(AuthRegister));\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState, authQrCode, returnToAuthPhoneNumber,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']),\n)(AuthCode));\n","import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/hooks/useOnChange.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx","webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/hooks/useLang.ts","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts"],"names":["cb","dependencies","prevDeps","usePrevious","some","d","i","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","onLoad","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","IS_IOS","style","undefined","ref","Portal","containerId","children","elementRef","document","createElement","useLayoutEffect","querySelector","element","classList","add","appendChild","TeactDOM","render","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","getAnimationData","name","path","replace","window","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","type","format","circle","Croppie","croppiePromise","cropper","file","onChange","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","error","initCropper","ensureCroppie","lang","useLang","Modal","isOpen","Boolean","title","hasCloseButton","Loading","Button","round","color","onClick","result","croppedImg","blobToFile","ariaLabel","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","role","tabIndex","event","target","files","value","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","addEventListener","removeEventListener","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","IS_MOBILE_SCREEN","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","isPasswordVisible","isBig","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","FOCUS_DELAY_TIMEOUT_MS","isLoading","hint","placeholder","submitLabel","clearError","onChangePasswordVisibility","onInputChange","onSubmit","inputRef","password","setPassword","canSubmit","setCanSubmit","IS_TOUCH_ENV","focus","requestAnimationFrame","select","action","preventDefault","autoComplete","e","length","MIN_PASSWORD_LENGTH","ripple","code","codeLength","trackingDirection","isTracking","idleMonkeyData","setIdleMonkeyData","trackingMonkeyData","setTrackingMonkeyData","TRACKING_FRAMES_PER_SYMBOL","AnimatedSticker","startFrame","endFrame","getTrackingFrames","useHistoryBack","handler","handlePopState","history","pushState","back","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","setCode","setIsTracking","setTrackingDirection","onCodeChange","currentTarget","substr","InputText","label","onInput","inputMode","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","PasswordForm","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","method","AvatarEditable","G","H","w","B","self","QrCreator","t","c","a","b","h","u","J","r","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","clearRect","Array","put","push","write","j","o","s","S","multiply","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","innerHTML","remove","token","isText","forceUpdate","useForceUpdate","useOnChange","langProvider","props","header","noBackdrop","onCloseAnimationEnd","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","handleKeyDown","key","stopPropagation","focusableElements","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","toggle","dispatchHeavyAnimationEvent"],"mappings":"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AAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GA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","file":"4.66638f18ab54b35d4ce9.js","sourcesContent":["import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_IOS } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName(\n 'AnimatedSticker',\n className,\n // Workaround for an iOS bug when animated stickers sometimes disappear\n IS_IOS && play && 'is-playing',\n );\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n
\n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [idleMonkeyData, setIdleMonkeyData] = useState>();\n const [trackingMonkeyData, setTrackingMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n useEffect(() => {\n if (!idleMonkeyData) {\n getAnimationData('MonkeyIdle').then(setIdleMonkeyData);\n }\n }, [idleMonkeyData]);\n\n useEffect(() => {\n if (!trackingMonkeyData) {\n getAnimationData('MonkeyTracking').then(setTrackingMonkeyData);\n }\n }, [trackingMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {idleMonkeyData && (\n \n )}\n {trackingMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(TrackingMonkey);\n","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nexport default function useHistoryBack(handler: NoneToVoidFunction) {\n function handlePopState() {\n handler();\n }\n\n window.addEventListener('popstate', handlePopState);\n window.history.pushState({}, '');\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.history.back();\n };\n}\n","import { FormEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [code, setCode] = useState('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n const onCodeChange = useCallback((e: FormEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n
\n
\n \n

\n {authPhoneNumber}\n \n \n

\n \n

\n {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\n

\n \n {authIsLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']),\n)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint, setAuthPassword, clearAuthError,\n}) => {\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n
\n
\n \n

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']),\n)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto,\n}) => {\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n function handleFirstNameChange(event: ChangeEvent) {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }\n\n function handleLastNameChange(event: ChangeEvent) {\n const { target } = event;\n\n setLastName(target.value);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n
\n
\n
\n \n

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\n \n \n {isButtonShown && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']),\n)(AuthRegister));\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState, authQrCode, returnToAuthPhoneNumber,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']),\n)(AuthCode));\n","import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5.006c0b4aaa5f2289238f.css b/dist/5.42b78d9f9dc78dd3f534.css similarity index 100% rename from dist/5.006c0b4aaa5f2289238f.css rename to dist/5.42b78d9f9dc78dd3f534.css diff --git a/dist/5.006c0b4aaa5f2289238f.js b/dist/5.42b78d9f9dc78dd3f534.js similarity index 98% rename from dist/5.006c0b4aaa5f2289238f.js rename to dist/5.42b78d9f9dc78dd3f534.js index ca2448497..f81a6a3ca 100644 --- a/dist/5.006c0b4aaa5f2289238f.js +++ b/dist/5.42b78d9f9dc78dd3f534.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{176:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},297:function(e,t,n){(function(i){var o,r;"undefined"!=typeof self&&self,void 0===(r="function"==typeof(o=function(){"function"!=typeof Promise&&function(t){function n(e,t){return function(){e.apply(t,arguments)}}function o(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],h(e,n(a,this),n(s,this))}function r(e){var t=this;return null===this._state?void this._deferreds.push(e):void p((function(){var n=t._state?e.onFulfilled:e.onRejected;if(null!==n){var i;try{i=n(t._value)}catch(t){return void e.reject(t)}e.resolve(i)}else(t._state?e.resolve:e.reject)(t._value)}))}function a(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void h(n(t,e),n(a,this),n(s,this))}this._state=!0,this._value=e,l.call(this)}catch(e){s.call(this,e)}}function s(e){this._state=!1,this._value=e,l.call(this)}function l(){for(var e=0,t=this._deferreds.length;t>e;e++)r.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function h(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){r.call(n,new c(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(r,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,(function(e){i(r,e)}),n)}e[r]=a,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,r=0;ri;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,r=new Uint8Array(o),a=0;a=5){var r=n;n=i,i=r}return{width:n,height:i}}n=c("transform"),t=c("transformOrigin"),o=c("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(ae.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,r=n.length>1?n[1]:0;return new y(o,r,i)},y.prototype.toString=function(){var e=w[ae.globals.translate].suffix||"";return ae.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,r=e.getContext("2d");switch(e.width=t.width,e.height=t.height,r.save(),n){case 2:r.translate(i,0),r.scale(-1,1);break;case 3:r.translate(i,o),r.rotate(180*Math.PI/180);break;case 4:r.translate(0,o),r.scale(1,-1);break;case 5:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.scale(1,-1);break;case 6:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.translate(0,-o);break;case 7:e.width=o,e.height=i,r.rotate(-90*Math.PI/180),r.translate(-i,o),r.scale(1,-1);break;case 8:e.width=o,e.height=i,r.translate(0,i),r.rotate(-90*Math.PI/180)}r.drawImage(t,0,0,i,o),r.restore()}function E(){var e,t,n,i,o,r,a=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,r=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:r+(isNaN(r)?"":"px")}),m(n,"cr-viewport"),a&&m(n,a),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),B.call(this),this.options.enableZoom&&I.call(this),this.options.enableResize&&T.call(this)}function _(){return this.options.enableExif&&window.EXIF}function T(){var e,t,n,i,r,a,s,l=this,c=document.createElement("div"),h=!1;function u(a){if((void 0===a.button||0===a.button)&&(a.preventDefault(),!h)){var s=l.elements.overlay.getBoundingClientRect();if(h=!0,t=a.pageX,n=a.pageY,e=-1!==a.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,r=s.height,a.touches){var c=a.touches[0];t=c.pageX,n=c.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var a=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var h=o.touches[0];a=h.pageX,s=h.pageY}var u=a-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=r?(d(c,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(c,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),Z.call(l),S.call(l),k.call(l),Y.call(l),n=s,t=a}function f(){h=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(c,"cr-resizer"),d(c,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(a=document.createElement("div"),"cr-resizer-vertical"),c.appendChild(a)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),c.appendChild(s)),a&&(a.addEventListener("mousedown",u),a.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(c)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function I(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){M.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function M(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),r=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),a=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=a.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,r),c=l.translate,h=l.origin;o.x>=c.maxX&&(a.x=h.minX,o.x=c.maxX),o.x<=c.minX&&(a.x=h.maxX,o.x=c.minX),o.y>=c.maxY&&(a.y=h.minY,o.y=c.maxY),o.y<=c.minY&&(a.y=h.maxY,o.y=c.minY)}s(),X.call(i),Y.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,r=this.elements.boundary.clientHeight/2,a=this.elements.preview.getBoundingClientRect(),s=a.width,l=a.height,c=n/2,h=i/2,u=-1*(c/t-o),p=-1*(h/t-r),d=1/t*c,m=1/t*h;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function k(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),r=this.elements.viewport.getBoundingClientRect(),a=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=r.top-o.top+r.height/2,c=r.left-o.left+r.width/2,h={},u={};if(e){var p=s.x,m=s.y,f=a.x,v=a.y;h.y=p,h.x=m,a.y=f,a.x=v}else h.y=l/i,h.x=c/i,u.y=(h.y-s.y)*(1-i),u.x=(h.x-s.x)*(1-i),a.x-=u.x,a.y-=u.y;var g={};g[t]=h.x+"px "+h.y+"px",g[n]=a.toString(),d(this.elements.preview,g)}function B(){var e,t,i,r,a,s=this,l=!1;function c(e,t){var n=s.elements.preview.getBoundingClientRect(),i=a.y+t,o=a.x+e;s.options.enforceBoundary?(r.top>n.top+t&&r.bottomn.left+e&&r.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}c(u,m),f[n]=a.toString(),d(s.elements.preview,f),Z.call(s),t=l,e=r}function f(){h(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",k.call(s),Y.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);a=y.parse(s.elements.preview),document.body.style[o]="none",r=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],r=e[1],l={};c(t,r),l[n]=a.toString(),d(s.elements.preview,l),Z.call(s),document.body.style[o]="",k.call(s),Y.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function Z(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,A,X=(F=Z,z=500,function(){var e=this,t=arguments,n=function(){A=null,O||F.apply(e,t)},i=O&&!A;clearTimeout(A),A=setTimeout(n,z),i&&F.apply(e,t)});function Y(){var e,t=this.get();j.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function j(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,r=new y(0,0,1),a=new b;j.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=r.toString(),i[t]=a.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,r.scale=this._currentZoom,i[n]=r.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),k.call(this),Z.call(this))}function S(e){var t,n,i,o,r=Math.max(this.options.minZoom,0)||0,a=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),c=this.elements.boundary.getBoundingClientRect(),h=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/h.width,o=u.height/h.height,r=Math.max(i,o)),r>=a&&(a=r+1),s.min=Q(r,4),s.max=Q(a,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*c),i<0&&(p=0,g=Math.abs(i)/r*h),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/r*h),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),a&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],r=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:r+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,r,a=this,s=[],l=null,c=_.call(a);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&a.data.url)return W.call(a),Y.call(a),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return a.data.bound=!1,a.data.url=n||a.data.url,a.data.boundZoom=l,(i=n,o=c,r=new Image,r.style.opacity="0",new Promise((function(e,t){function n(){r.style.opacity="1",setTimeout((function(){e(r)}),1)}r.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&r.setAttribute("crossOrigin","anonymous"),r.onload=function(){o?EXIF.getData(r,(function(){n()})):n()},r.onerror=function(e){r.style.opacity=1,setTimeout((function(){t(e)}),1)},r.src=i}))).then((function(n){if(U.call(a,n),s.length)a.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,r=g(n),l=a.elements.viewport.getBoundingClientRect(),c=l.width/l.height;r.width/r.height>c?i=(o=r.height)*c:(i=r.width,o=r.height/c);var h=(r.width-i)/2,u=(r.height-o)/2,p=h+i,d=u+o;a.data.points=[h,u,p,d]}a.data.points=s.map((function(e){return parseFloat(e)})),a.options.useCanvas&&P.call(a,e.orientation),W.call(a),Y.call(a),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,r=(t.height-this.elements.viewport.offsetHeight)/2,a=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+r,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var c=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(c,n/l),i=Math.max(c,i/l),a=Math.max(c,a/l),s=Math.max(c,s/l),{points:[Q(n),Q(i),Q(a),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=h(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",r=i.size||"viewport",a=i.format,s=i.quality,l=i.backgroundColor,c="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===r?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof r&&(r.width&&r.height?(n.outputWidth=r.width,n.outputHeight=r.height):r.width?(n.outputWidth=r.width,n.outputHeight=r.width/d):r.height&&(n.outputWidth=r.height*d,n.outputHeight=r.height)),ee.indexOf(a)>-1&&(n.format="image/"+a,n.quality=s),n.circle=c,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,r,a=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),r=n/90%i.length,i[(i.length+o+r%i.length)%i.length]),C(a,this.elements.img,this.data.orientation),k.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var re=window.jQuery;re.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=re(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=re(this).data("croppie");if(t){var i=t[e];if(!re.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&re(this).removeData("croppie")}}))}return this.each((function(){var t=new ae(this,e);t.$=re,re(this).data("croppie",t)}))}}function ae(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=h(u(ae.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return ae.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},ae.globals={translate:"translate3d"},h(ae.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),ae})?o.call(t,n,t,e):o)||(e.exports=r)}).call(this,n(298).setImmediate)},298:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new r(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(299),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(176))},299:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,r,a,s,l=1,c={},h=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&m(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;ne;e++)r.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function h(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){r.call(n,new c(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(r,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,(function(e){i(r,e)}),n)}e[r]=a,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,r=0;ri;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,r=new Uint8Array(o),a=0;a=5){var r=n;n=i,i=r}return{width:n,height:i}}n=c("transform"),t=c("transformOrigin"),o=c("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(ae.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,r=n.length>1?n[1]:0;return new y(o,r,i)},y.prototype.toString=function(){var e=w[ae.globals.translate].suffix||"";return ae.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,r=e.getContext("2d");switch(e.width=t.width,e.height=t.height,r.save(),n){case 2:r.translate(i,0),r.scale(-1,1);break;case 3:r.translate(i,o),r.rotate(180*Math.PI/180);break;case 4:r.translate(0,o),r.scale(1,-1);break;case 5:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.scale(1,-1);break;case 6:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.translate(0,-o);break;case 7:e.width=o,e.height=i,r.rotate(-90*Math.PI/180),r.translate(-i,o),r.scale(1,-1);break;case 8:e.width=o,e.height=i,r.translate(0,i),r.rotate(-90*Math.PI/180)}r.drawImage(t,0,0,i,o),r.restore()}function E(){var e,t,n,i,o,r,a=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,r=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:r+(isNaN(r)?"":"px")}),m(n,"cr-viewport"),a&&m(n,a),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),B.call(this),this.options.enableZoom&&I.call(this),this.options.enableResize&&T.call(this)}function _(){return this.options.enableExif&&window.EXIF}function T(){var e,t,n,i,r,a,s,l=this,c=document.createElement("div"),h=!1;function u(a){if((void 0===a.button||0===a.button)&&(a.preventDefault(),!h)){var s=l.elements.overlay.getBoundingClientRect();if(h=!0,t=a.pageX,n=a.pageY,e=-1!==a.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,r=s.height,a.touches){var c=a.touches[0];t=c.pageX,n=c.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var a=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var h=o.touches[0];a=h.pageX,s=h.pageY}var u=a-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=r?(d(c,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(c,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),Z.call(l),S.call(l),k.call(l),Y.call(l),n=s,t=a}function f(){h=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(c,"cr-resizer"),d(c,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(a=document.createElement("div"),"cr-resizer-vertical"),c.appendChild(a)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),c.appendChild(s)),a&&(a.addEventListener("mousedown",u),a.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(c)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function I(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){M.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function M(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),r=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),a=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=a.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,r),c=l.translate,h=l.origin;o.x>=c.maxX&&(a.x=h.minX,o.x=c.maxX),o.x<=c.minX&&(a.x=h.maxX,o.x=c.minX),o.y>=c.maxY&&(a.y=h.minY,o.y=c.maxY),o.y<=c.minY&&(a.y=h.maxY,o.y=c.minY)}s(),X.call(i),Y.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,r=this.elements.boundary.clientHeight/2,a=this.elements.preview.getBoundingClientRect(),s=a.width,l=a.height,c=n/2,h=i/2,u=-1*(c/t-o),p=-1*(h/t-r),d=1/t*c,m=1/t*h;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function k(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),r=this.elements.viewport.getBoundingClientRect(),a=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=r.top-o.top+r.height/2,c=r.left-o.left+r.width/2,h={},u={};if(e){var p=s.x,m=s.y,f=a.x,v=a.y;h.y=p,h.x=m,a.y=f,a.x=v}else h.y=l/i,h.x=c/i,u.y=(h.y-s.y)*(1-i),u.x=(h.x-s.x)*(1-i),a.x-=u.x,a.y-=u.y;var g={};g[t]=h.x+"px "+h.y+"px",g[n]=a.toString(),d(this.elements.preview,g)}function B(){var e,t,i,r,a,s=this,l=!1;function c(e,t){var n=s.elements.preview.getBoundingClientRect(),i=a.y+t,o=a.x+e;s.options.enforceBoundary?(r.top>n.top+t&&r.bottomn.left+e&&r.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}c(u,m),f[n]=a.toString(),d(s.elements.preview,f),Z.call(s),t=l,e=r}function f(){h(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",k.call(s),Y.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);a=y.parse(s.elements.preview),document.body.style[o]="none",r=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],r=e[1],l={};c(t,r),l[n]=a.toString(),d(s.elements.preview,l),Z.call(s),document.body.style[o]="",k.call(s),Y.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function Z(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,A,X=(F=Z,z=500,function(){var e=this,t=arguments,n=function(){A=null,O||F.apply(e,t)},i=O&&!A;clearTimeout(A),A=setTimeout(n,z),i&&F.apply(e,t)});function Y(){var e,t=this.get();j.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function j(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,r=new y(0,0,1),a=new b;j.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=r.toString(),i[t]=a.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,r.scale=this._currentZoom,i[n]=r.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),k.call(this),Z.call(this))}function S(e){var t,n,i,o,r=Math.max(this.options.minZoom,0)||0,a=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),c=this.elements.boundary.getBoundingClientRect(),h=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/h.width,o=u.height/h.height,r=Math.max(i,o)),r>=a&&(a=r+1),s.min=Q(r,4),s.max=Q(a,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*c),i<0&&(p=0,g=Math.abs(i)/r*h),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/r*h),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),a&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],r=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:r+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,r,a=this,s=[],l=null,c=_.call(a);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&a.data.url)return W.call(a),Y.call(a),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return a.data.bound=!1,a.data.url=n||a.data.url,a.data.boundZoom=l,(i=n,o=c,r=new Image,r.style.opacity="0",new Promise((function(e,t){function n(){r.style.opacity="1",setTimeout((function(){e(r)}),1)}r.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&r.setAttribute("crossOrigin","anonymous"),r.onload=function(){o?EXIF.getData(r,(function(){n()})):n()},r.onerror=function(e){r.style.opacity=1,setTimeout((function(){t(e)}),1)},r.src=i}))).then((function(n){if(U.call(a,n),s.length)a.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,r=g(n),l=a.elements.viewport.getBoundingClientRect(),c=l.width/l.height;r.width/r.height>c?i=(o=r.height)*c:(i=r.width,o=r.height/c);var h=(r.width-i)/2,u=(r.height-o)/2,p=h+i,d=u+o;a.data.points=[h,u,p,d]}a.data.points=s.map((function(e){return parseFloat(e)})),a.options.useCanvas&&P.call(a,e.orientation),W.call(a),Y.call(a),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,r=(t.height-this.elements.viewport.offsetHeight)/2,a=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+r,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var c=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(c,n/l),i=Math.max(c,i/l),a=Math.max(c,a/l),s=Math.max(c,s/l),{points:[Q(n),Q(i),Q(a),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=h(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",r=i.size||"viewport",a=i.format,s=i.quality,l=i.backgroundColor,c="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===r?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof r&&(r.width&&r.height?(n.outputWidth=r.width,n.outputHeight=r.height):r.width?(n.outputWidth=r.width,n.outputHeight=r.width/d):r.height&&(n.outputWidth=r.height*d,n.outputHeight=r.height)),ee.indexOf(a)>-1&&(n.format="image/"+a,n.quality=s),n.circle=c,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,r,a=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),r=n/90%i.length,i[(i.length+o+r%i.length)%i.length]),C(a,this.elements.img,this.data.orientation),k.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var re=window.jQuery;re.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=re(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=re(this).data("croppie");if(t){var i=t[e];if(!re.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&re(this).removeData("croppie")}}))}return this.each((function(){var t=new ae(this,e);t.$=re,re(this).data("croppie",t)}))}}function ae(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=h(u(ae.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return ae.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},ae.globals={translate:"translate3d"},h(ae.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),ae})?o.call(t,n,t,e):o)||(e.exports=r)}).call(this,n(299).setImmediate)},299:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new r(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(300),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(177))},300:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,r,a,s,l=1,c={},h=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&m(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;na;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled=\"function\"===typeof a?a:null,this.onRejected=\"function\"===typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k=\"function\"===typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)};c.prototype[\"catch\"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&(\"object\"===typeof g||\"function\"===typeof g)){var h=g.then;if(\"function\"===typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},\"undefined\"!==typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this);\r\n }\r\n\r\n if ( typeof window.CustomEvent !== \"function\" ) {\r\n (function(){\r\n function CustomEvent ( event, params ) {\r\n params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n var evt = document.createEvent( 'CustomEvent' );\r\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\r\n return evt;\r\n }\r\n CustomEvent.prototype = window.Event.prototype;\r\n window.CustomEvent = CustomEvent;\r\n }());\r\n }\r\n\r\n if (!HTMLCanvasElement.prototype.toBlob) {\r\n Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {\r\n value: function (callback, type, quality) {\r\n var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),\r\n len = binStr.length,\r\n arr = new Uint8Array(len);\r\n\r\n for (var i=0; i -1 ? EXIF_NORM : EXIF_FLIP,\r\n index = arr.indexOf(ornt),\r\n offset = (rotate / 90) % arr.length;// 180 = 2%4 = 2 shift exif by 2 indexes\r\n\r\n return arr[(arr.length + index + (offset % arr.length)) % arr.length];\r\n }\r\n\r\n // Credits to : Andrew Dupont - http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/\r\n function deepExtend(destination, source) {\r\n destination = destination || {};\r\n for (var property in source) {\r\n if (source[property] && source[property].constructor && source[property].constructor === Object) {\r\n destination[property] = destination[property] || {};\r\n deepExtend(destination[property], source[property]);\r\n } else {\r\n destination[property] = source[property];\r\n }\r\n }\r\n return destination;\r\n }\r\n\r\n function clone(object) {\r\n return deepExtend({}, object);\r\n }\r\n\r\n function debounce(func, wait, immediate) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n }\r\n\r\n function dispatchChange(element) {\r\n if (\"createEvent\" in document) {\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", false, true);\r\n element.dispatchEvent(evt);\r\n }\r\n else {\r\n element.fireEvent(\"onchange\");\r\n }\r\n }\r\n\r\n //http://jsperf.com/vanilla-css\r\n function css(el, styles, val) {\r\n if (typeof (styles) === 'string') {\r\n var tmp = styles;\r\n styles = {};\r\n styles[tmp] = val;\r\n }\r\n\r\n for (var prop in styles) {\r\n el.style[prop] = styles[prop];\r\n }\r\n }\r\n\r\n function addClass(el, c) {\r\n if (el.classList) {\r\n el.classList.add(c);\r\n }\r\n else {\r\n el.className += ' ' + c;\r\n }\r\n }\r\n\r\n function removeClass(el, c) {\r\n if (el.classList) {\r\n el.classList.remove(c);\r\n }\r\n else {\r\n el.className = el.className.replace(c, '');\r\n }\r\n }\r\n\r\n function setAttributes(el, attrs) {\r\n for (var key in attrs) {\r\n el.setAttribute(key, attrs[key]);\r\n }\r\n }\r\n\r\n function num(v) {\r\n return parseInt(v, 10);\r\n }\r\n\r\n /* Utilities */\r\n function loadImage(src, doExif) {\r\n var img = new Image();\r\n img.style.opacity = '0';\r\n return new Promise(function (resolve, reject) {\r\n function _resolve() {\r\n img.style.opacity = '1';\r\n setTimeout(function () {\r\n resolve(img);\r\n }, 1);\r\n }\r\n\r\n img.removeAttribute('crossOrigin');\r\n if (src.match(/^https?:\\/\\/|^\\/\\//)) {\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n }\r\n\r\n img.onload = function () {\r\n if (doExif) {\r\n EXIF.getData(img, function () {\r\n _resolve();\r\n });\r\n }\r\n else {\r\n _resolve();\r\n }\r\n };\r\n img.onerror = function (ev) {\r\n img.style.opacity = 1;\r\n setTimeout(function () {\r\n reject(ev);\r\n }, 1);\r\n };\r\n img.src = src;\r\n });\r\n }\r\n\r\n function naturalImageDimensions(img, ornt) {\r\n var w = img.naturalWidth;\r\n var h = img.naturalHeight;\r\n var orient = ornt || getExifOrientation(img);\r\n if (orient && orient >= 5) {\r\n var x= w;\r\n w = h;\r\n h = x;\r\n }\r\n return { width: w, height: h };\r\n }\r\n\r\n /* CSS Transform Prototype */\r\n var TRANSLATE_OPTS = {\r\n 'translate3d': {\r\n suffix: ', 0px'\r\n },\r\n 'translate': {\r\n suffix: ''\r\n }\r\n };\r\n var Transform = function (x, y, scale) {\r\n this.x = parseFloat(x);\r\n this.y = parseFloat(y);\r\n this.scale = parseFloat(scale);\r\n };\r\n\r\n Transform.parse = function (v) {\r\n if (v.style) {\r\n return Transform.parse(v.style[CSS_TRANSFORM]);\r\n }\r\n else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) {\r\n return Transform.fromMatrix(v);\r\n }\r\n else {\r\n return Transform.fromString(v);\r\n }\r\n };\r\n\r\n Transform.fromMatrix = function (v) {\r\n var vals = v.substring(7).split(',');\r\n if (!vals.length || v === 'none') {\r\n vals = [1, 0, 0, 1, 0, 0];\r\n }\r\n\r\n return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0]));\r\n };\r\n\r\n Transform.fromString = function (v) {\r\n var values = v.split(') '),\r\n translate = values[0].substring(Croppie.globals.translate.length + 1).split(','),\r\n scale = values.length > 1 ? values[1].substring(6) : 1,\r\n x = translate.length > 1 ? translate[0] : 0,\r\n y = translate.length > 1 ? translate[1] : 0;\r\n\r\n return new Transform(x, y, scale);\r\n };\r\n\r\n Transform.prototype.toString = function () {\r\n var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || '';\r\n return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')';\r\n };\r\n\r\n var TransformOrigin = function (el) {\r\n if (!el || !el.style[CSS_TRANS_ORG]) {\r\n this.x = 0;\r\n this.y = 0;\r\n return;\r\n }\r\n var css = el.style[CSS_TRANS_ORG].split(' ');\r\n this.x = parseFloat(css[0]);\r\n this.y = parseFloat(css[1]);\r\n };\r\n\r\n TransformOrigin.prototype.toString = function () {\r\n return this.x + 'px ' + this.y + 'px';\r\n };\r\n\r\n function getExifOrientation (img) {\r\n return img.exifdata && img.exifdata.Orientation ? num(img.exifdata.Orientation) : 1;\r\n }\r\n\r\n function drawCanvas(canvas, img, orientation) {\r\n var width = img.width,\r\n height = img.height,\r\n ctx = canvas.getContext('2d');\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.save();\r\n switch (orientation) {\r\n case 2:\r\n ctx.translate(width, 0);\r\n ctx.scale(-1, 1);\r\n break;\r\n\r\n case 3:\r\n ctx.translate(width, height);\r\n ctx.rotate(180*Math.PI/180);\r\n break;\r\n\r\n case 4:\r\n ctx.translate(0, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 5:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 6:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.translate(0, -height);\r\n break;\r\n\r\n case 7:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(-90*Math.PI/180);\r\n ctx.translate(-width, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 8:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.translate(0, width);\r\n ctx.rotate(-90*Math.PI/180);\r\n break;\r\n }\r\n ctx.drawImage(img, 0,0, width, height);\r\n ctx.restore();\r\n }\r\n\r\n /* Private Methods */\r\n function _create() {\r\n var self = this,\r\n contClass = 'croppie-container',\r\n customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null,\r\n boundary, img, viewport, overlay, bw, bh;\r\n\r\n self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self);\r\n // Properties on class\r\n self.data = {};\r\n self.elements = {};\r\n\r\n boundary = self.elements.boundary = document.createElement('div');\r\n viewport = self.elements.viewport = document.createElement('div');\r\n img = self.elements.img = document.createElement('img');\r\n overlay = self.elements.overlay = document.createElement('div');\r\n\r\n if (self.options.useCanvas) {\r\n self.elements.canvas = document.createElement('canvas');\r\n self.elements.preview = self.elements.canvas;\r\n }\r\n else {\r\n self.elements.preview = img;\r\n }\r\n\r\n addClass(boundary, 'cr-boundary');\r\n boundary.setAttribute('aria-dropeffect', 'none');\r\n bw = self.options.boundary.width;\r\n bh = self.options.boundary.height;\r\n css(boundary, {\r\n width: (bw + (isNaN(bw) ? '' : 'px')),\r\n height: (bh + (isNaN(bh) ? '' : 'px'))\r\n });\r\n\r\n addClass(viewport, 'cr-viewport');\r\n if (customViewportClass) {\r\n addClass(viewport, customViewportClass);\r\n }\r\n css(viewport, {\r\n width: self.options.viewport.width + 'px',\r\n height: self.options.viewport.height + 'px'\r\n });\r\n viewport.setAttribute('tabindex', 0);\r\n\r\n addClass(self.elements.preview, 'cr-image');\r\n setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' });\r\n addClass(overlay, 'cr-overlay');\r\n\r\n self.element.appendChild(boundary);\r\n boundary.appendChild(self.elements.preview);\r\n boundary.appendChild(viewport);\r\n boundary.appendChild(overlay);\r\n\r\n addClass(self.element, contClass);\r\n if (self.options.customClass) {\r\n addClass(self.element, self.options.customClass);\r\n }\r\n\r\n _initDraggable.call(this);\r\n\r\n if (self.options.enableZoom) {\r\n _initializeZoom.call(self);\r\n }\r\n\r\n // if (self.options.enableOrientation) {\r\n // _initRotationControls.call(self);\r\n // }\r\n\r\n if (self.options.enableResize) {\r\n _initializeResize.call(self);\r\n }\r\n }\r\n\r\n // function _initRotationControls () {\r\n // var self = this,\r\n // wrap, btnLeft, btnRight, iLeft, iRight;\r\n\r\n // wrap = document.createElement('div');\r\n // self.elements.orientationBtnLeft = btnLeft = document.createElement('button');\r\n // self.elements.orientationBtnRight = btnRight = document.createElement('button');\r\n\r\n // wrap.appendChild(btnLeft);\r\n // wrap.appendChild(btnRight);\r\n\r\n // iLeft = document.createElement('i');\r\n // iRight = document.createElement('i');\r\n // btnLeft.appendChild(iLeft);\r\n // btnRight.appendChild(iRight);\r\n\r\n // addClass(wrap, 'cr-rotate-controls');\r\n // addClass(btnLeft, 'cr-rotate-l');\r\n // addClass(btnRight, 'cr-rotate-r');\r\n\r\n // self.elements.boundary.appendChild(wrap);\r\n\r\n // btnLeft.addEventListener('click', function () {\r\n // self.rotate(-90);\r\n // });\r\n // btnRight.addEventListener('click', function () {\r\n // self.rotate(90);\r\n // });\r\n // }\r\n\r\n function _hasExif() {\r\n return this.options.enableExif && window.EXIF;\r\n }\r\n\r\n function _initializeResize () {\r\n var self = this;\r\n var wrap = document.createElement('div');\r\n var isDragging = false;\r\n var direction;\r\n var originalX;\r\n var originalY;\r\n var minSize = 50;\r\n var maxWidth;\r\n var maxHeight;\r\n var vr;\r\n var hr;\r\n\r\n addClass(wrap, 'cr-resizer');\r\n css(wrap, {\r\n width: this.options.viewport.width + 'px',\r\n height: this.options.viewport.height + 'px'\r\n });\r\n\r\n if (this.options.resizeControls.height) {\r\n vr = document.createElement('div');\r\n addClass(vr, 'cr-resizer-vertical');\r\n wrap.appendChild(vr);\r\n }\r\n\r\n if (this.options.resizeControls.width) {\r\n hr = document.createElement('div');\r\n addClass(hr, 'cr-resizer-horisontal');\r\n wrap.appendChild(hr);\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) {\r\n return;\r\n }\r\n\r\n var overlayRect = self.elements.overlay.getBoundingClientRect();\r\n\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h';\r\n maxWidth = overlayRect.width;\r\n maxHeight = overlayRect.height;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n }\r\n\r\n function mouseMove(ev) {\r\n var pageX = ev.pageX;\r\n var pageY = ev.pageY;\r\n\r\n ev.preventDefault();\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX;\r\n var deltaY = pageY - originalY;\r\n var newHeight = self.options.viewport.height + deltaY;\r\n var newWidth = self.options.viewport.width + deltaX;\r\n\r\n if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) {\r\n css(wrap, {\r\n height: newHeight + 'px'\r\n });\r\n\r\n self.options.boundary.height += deltaY;\r\n css(self.elements.boundary, {\r\n height: self.options.boundary.height + 'px'\r\n });\r\n\r\n self.options.viewport.height += deltaY;\r\n css(self.elements.viewport, {\r\n height: self.options.viewport.height + 'px'\r\n });\r\n }\r\n else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) {\r\n css(wrap, {\r\n width: newWidth + 'px'\r\n });\r\n\r\n self.options.boundary.width += deltaX;\r\n css(self.elements.boundary, {\r\n width: self.options.boundary.width + 'px'\r\n });\r\n\r\n self.options.viewport.width += deltaX;\r\n css(self.elements.viewport, {\r\n width: self.options.viewport.width + 'px'\r\n });\r\n }\r\n\r\n _updateOverlay.call(self);\r\n _updateZoomLimits.call(self);\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n }\r\n\r\n if (vr) {\r\n vr.addEventListener('mousedown', mouseDown);\r\n vr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n if (hr) {\r\n hr.addEventListener('mousedown', mouseDown);\r\n hr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n this.elements.boundary.appendChild(wrap);\r\n }\r\n\r\n function _setZoomerVal(v) {\r\n if (this.options.enableZoom) {\r\n var z = this.elements.zoomer,\r\n val = fix(v, 4);\r\n\r\n z.value = Math.max(parseFloat(z.min), Math.min(parseFloat(z.max), val)).toString();\r\n }\r\n }\r\n\r\n function _initializeZoom() {\r\n var self = this,\r\n wrap = self.elements.zoomerWrap = document.createElement('div'),\r\n zoomer = self.elements.zoomer = document.createElement('input');\r\n\r\n addClass(wrap, 'cr-slider-wrap');\r\n addClass(zoomer, 'cr-slider');\r\n zoomer.type = 'range';\r\n zoomer.step = '0.0001';\r\n zoomer.value = '1';\r\n zoomer.style.display = self.options.showZoomer ? '' : 'none';\r\n zoomer.setAttribute('aria-label', 'zoom');\r\n\r\n self.element.appendChild(wrap);\r\n wrap.appendChild(zoomer);\r\n\r\n self._currentZoom = 1;\r\n\r\n function change() {\r\n _onZoom.call(self, {\r\n value: parseFloat(zoomer.value),\r\n origin: new TransformOrigin(self.elements.preview),\r\n viewportRect: self.elements.viewport.getBoundingClientRect(),\r\n transform: Transform.parse(self.elements.preview)\r\n });\r\n }\r\n\r\n function scroll(ev) {\r\n var delta, targetZoom;\r\n\r\n if(self.options.mouseWheelZoom === 'ctrl' && ev.ctrlKey !== true){\r\n return 0; \r\n } else if (ev.wheelDelta) {\r\n delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2\r\n } else if (ev.deltaY) {\r\n delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2\r\n } else if (ev.detail) {\r\n delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2\r\n } else {\r\n delta = 0;\r\n }\r\n\r\n targetZoom = self._currentZoom + (delta * self._currentZoom);\r\n\r\n ev.preventDefault();\r\n _setZoomerVal.call(self, targetZoom);\r\n change.call(self);\r\n }\r\n\r\n self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress\r\n self.elements.zoomer.addEventListener('change', change);\r\n\r\n if (self.options.mouseWheelZoom) {\r\n self.elements.boundary.addEventListener('mousewheel', scroll);\r\n self.elements.boundary.addEventListener('DOMMouseScroll', scroll);\r\n }\r\n }\r\n\r\n function _onZoom(ui) {\r\n var self = this,\r\n transform = ui ? ui.transform : Transform.parse(self.elements.preview),\r\n vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(),\r\n origin = ui ? ui.origin : new TransformOrigin(self.elements.preview);\r\n\r\n function applyCss() {\r\n var transCss = {};\r\n transCss[CSS_TRANSFORM] = transform.toString();\r\n transCss[CSS_TRANS_ORG] = origin.toString();\r\n css(self.elements.preview, transCss);\r\n }\r\n\r\n self._currentZoom = ui ? ui.value : self._currentZoom;\r\n transform.scale = self._currentZoom;\r\n self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom);\r\n applyCss();\r\n\r\n if (self.options.enforceBoundary) {\r\n var boundaries = _getVirtualBoundaries.call(self, vpRect),\r\n transBoundaries = boundaries.translate,\r\n oBoundaries = boundaries.origin;\r\n\r\n if (transform.x >= transBoundaries.maxX) {\r\n origin.x = oBoundaries.minX;\r\n transform.x = transBoundaries.maxX;\r\n }\r\n\r\n if (transform.x <= transBoundaries.minX) {\r\n origin.x = oBoundaries.maxX;\r\n transform.x = transBoundaries.minX;\r\n }\r\n\r\n if (transform.y >= transBoundaries.maxY) {\r\n origin.y = oBoundaries.minY;\r\n transform.y = transBoundaries.maxY;\r\n }\r\n\r\n if (transform.y <= transBoundaries.minY) {\r\n origin.y = oBoundaries.maxY;\r\n transform.y = transBoundaries.minY;\r\n }\r\n }\r\n applyCss();\r\n _debouncedOverlay.call(self);\r\n _triggerUpdate.call(self);\r\n }\r\n\r\n function _getVirtualBoundaries(viewport) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n vpWidth = viewport.width,\r\n vpHeight = viewport.height,\r\n centerFromBoundaryX = self.elements.boundary.clientWidth / 2,\r\n centerFromBoundaryY = self.elements.boundary.clientHeight / 2,\r\n imgRect = self.elements.preview.getBoundingClientRect(),\r\n curImgWidth = imgRect.width,\r\n curImgHeight = imgRect.height,\r\n halfWidth = vpWidth / 2,\r\n halfHeight = vpHeight / 2;\r\n\r\n var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1;\r\n var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale)));\r\n\r\n var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1;\r\n var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale)));\r\n\r\n var originMinX = (1 / scale) * halfWidth;\r\n var originMaxX = (curImgWidth * (1 / scale)) - originMinX;\r\n\r\n var originMinY = (1 / scale) * halfHeight;\r\n var originMaxY = (curImgHeight * (1 / scale)) - originMinY;\r\n\r\n return {\r\n translate: {\r\n maxX: maxX,\r\n minX: minX,\r\n maxY: maxY,\r\n minY: minY\r\n },\r\n origin: {\r\n maxX: originMaxX,\r\n minX: originMinX,\r\n maxY: originMaxY,\r\n minY: originMinY\r\n }\r\n };\r\n }\r\n\r\n function _updateCenterPoint(rotate) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n data = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]),\r\n pc = new TransformOrigin(self.elements.preview),\r\n top = (vpData.top - data.top) + (vpData.height / 2),\r\n left = (vpData.left - data.left) + (vpData.width / 2),\r\n center = {},\r\n adj = {};\r\n\r\n if (rotate) {\r\n var cx = pc.x;\r\n var cy = pc.y;\r\n var tx = transform.x;\r\n var ty = transform.y;\r\n\r\n center.y = cx;\r\n center.x = cy;\r\n transform.y = tx;\r\n transform.x = ty;\r\n }\r\n else {\r\n center.y = top / scale;\r\n center.x = left / scale;\r\n\r\n adj.y = (center.y - pc.y) * (1 - scale);\r\n adj.x = (center.x - pc.x) * (1 - scale);\r\n\r\n transform.x -= adj.x;\r\n transform.y -= adj.y;\r\n }\r\n\r\n var newCss = {};\r\n newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px';\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n }\r\n\r\n function _initDraggable() {\r\n var self = this,\r\n isDragging = false,\r\n originalX,\r\n originalY,\r\n originalDistance,\r\n vpRect,\r\n transform;\r\n\r\n function assignTransformCoordinates(deltaX, deltaY) {\r\n var imgRect = self.elements.preview.getBoundingClientRect(),\r\n top = transform.y + deltaY,\r\n left = transform.x + deltaX;\r\n\r\n if (self.options.enforceBoundary) {\r\n if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) {\r\n transform.y = top;\r\n }\r\n\r\n if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) {\r\n transform.x = left;\r\n }\r\n }\r\n else {\r\n transform.y = top;\r\n transform.x = left;\r\n }\r\n }\r\n\r\n function toggleGrabState(isDragging) {\r\n self.elements.preview.setAttribute('aria-grabbed', isDragging);\r\n self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none');\r\n }\r\n\r\n function keyDown(ev) {\r\n var LEFT_ARROW = 37,\r\n UP_ARROW = 38,\r\n RIGHT_ARROW = 39,\r\n DOWN_ARROW = 40;\r\n\r\n if (ev.shiftKey && (ev.keyCode === UP_ARROW || ev.keyCode === DOWN_ARROW)) {\r\n var zoom;\r\n if (ev.keyCode === UP_ARROW) {\r\n zoom = parseFloat(self.elements.zoomer.value) + parseFloat(self.elements.zoomer.step)\r\n }\r\n else {\r\n zoom = parseFloat(self.elements.zoomer.value) - parseFloat(self.elements.zoomer.step)\r\n }\r\n self.setZoom(zoom);\r\n }\r\n else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) {\r\n ev.preventDefault();\r\n var movement = parseKeyDown(ev.keyCode);\r\n\r\n transform = Transform.parse(self.elements.preview);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n keyMove(movement);\r\n }\r\n\r\n function parseKeyDown(key) {\r\n switch (key) {\r\n case LEFT_ARROW:\r\n return [1, 0];\r\n case UP_ARROW:\r\n return [0, 1];\r\n case RIGHT_ARROW:\r\n return [-1, 0];\r\n case DOWN_ARROW:\r\n return [0, -1];\r\n }\r\n }\r\n }\r\n\r\n function keyMove(movement) {\r\n var deltaX = movement[0],\r\n deltaY = movement[1],\r\n newCss = {};\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) return;\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n toggleGrabState(isDragging);\r\n transform = Transform.parse(self.elements.preview);\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n }\r\n\r\n function mouseMove(ev) {\r\n ev.preventDefault();\r\n var pageX = ev.pageX,\r\n pageY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX,\r\n deltaY = pageY - originalY,\r\n newCss = {};\r\n\r\n if (ev.type === 'touchmove') {\r\n if (ev.touches.length > 1) {\r\n var touch1 = ev.touches[0];\r\n var touch2 = ev.touches[1];\r\n var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY));\r\n\r\n if (!originalDistance) {\r\n originalDistance = dist / self._currentZoom;\r\n }\r\n\r\n var scale = dist / originalDistance;\r\n\r\n _setZoomerVal.call(self, scale);\r\n dispatchChange(self.elements.zoomer);\r\n return;\r\n }\r\n }\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n toggleGrabState(isDragging);\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n self.elements.overlay.addEventListener('mousedown', mouseDown);\r\n self.elements.viewport.addEventListener('keydown', keyDown);\r\n self.elements.overlay.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n function _updateOverlay() {\r\n if (!this.elements) return; // since this is debounced, it can be fired after destroy\r\n var self = this,\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n css(self.elements.overlay, {\r\n width: imgData.width + 'px',\r\n height: imgData.height + 'px',\r\n top: (imgData.top - boundRect.top) + 'px',\r\n left: (imgData.left - boundRect.left) + 'px'\r\n });\r\n }\r\n var _debouncedOverlay = debounce(_updateOverlay, 500);\r\n\r\n function _triggerUpdate() {\r\n var self = this,\r\n data = self.get();\r\n\r\n if (!_isVisible.call(self)) {\r\n return;\r\n }\r\n\r\n self.options.update.call(self, data);\r\n if (self.$ && typeof Prototype === 'undefined') {\r\n self.$(self.element).trigger('update.croppie', data);\r\n }\r\n else {\r\n var ev;\r\n if (window.CustomEvent) {\r\n ev = new CustomEvent('update', { detail: data });\r\n } else {\r\n ev = document.createEvent('CustomEvent');\r\n ev.initCustomEvent('update', true, true, data);\r\n }\r\n\r\n self.element.dispatchEvent(ev);\r\n }\r\n }\r\n\r\n function _isVisible() {\r\n return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0;\r\n }\r\n\r\n function _updatePropertiesFromImage() {\r\n var self = this,\r\n initialZoom = 1,\r\n cssReset = {},\r\n img = self.elements.preview,\r\n imgData,\r\n transformReset = new Transform(0, 0, initialZoom),\r\n originReset = new TransformOrigin(),\r\n isVisible = _isVisible.call(self);\r\n\r\n if (!isVisible || self.data.bound) {// if the croppie isn't visible or it doesn't need binding\r\n return;\r\n }\r\n\r\n self.data.bound = true;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n cssReset[CSS_TRANS_ORG] = originReset.toString();\r\n cssReset['opacity'] = 1;\r\n css(img, cssReset);\r\n\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n self._originalImageWidth = imgData.width;\r\n self._originalImageHeight = imgData.height;\r\n self.data.orientation = getExifOrientation(self.elements.img);\r\n\r\n if (self.options.enableZoom) {\r\n _updateZoomLimits.call(self, true);\r\n }\r\n else {\r\n self._currentZoom = initialZoom;\r\n }\r\n\r\n transformReset.scale = self._currentZoom;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n css(img, cssReset);\r\n\r\n if (self.data.points.length) {\r\n _bindPoints.call(self, self.data.points);\r\n }\r\n else {\r\n _centerImage.call(self);\r\n }\r\n\r\n _updateCenterPoint.call(self);\r\n _updateOverlay.call(self);\r\n }\r\n\r\n function _updateZoomLimits (initial) {\r\n var self = this,\r\n minZoom = Math.max(self.options.minZoom, 0) || 0,\r\n maxZoom = self.options.maxZoom || 1.5,\r\n initialZoom,\r\n defaultInitialZoom,\r\n zoomer = self.elements.zoomer,\r\n scale = parseFloat(zoomer.value),\r\n boundaryData = self.elements.boundary.getBoundingClientRect(),\r\n imgData = naturalImageDimensions(self.elements.img, self.data.orientation),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n minW,\r\n minH;\r\n if (self.options.enforceBoundary) {\r\n minW = vpData.width / imgData.width;\r\n minH = vpData.height / imgData.height;\r\n minZoom = Math.max(minW, minH);\r\n }\r\n\r\n if (minZoom >= maxZoom) {\r\n maxZoom = minZoom + 1;\r\n }\r\n\r\n zoomer.min = fix(minZoom, 4);\r\n zoomer.max = fix(maxZoom, 4);\r\n \r\n if (!initial && (scale < zoomer.min || scale > zoomer.max)) {\r\n _setZoomerVal.call(self, scale < zoomer.min ? zoomer.min : zoomer.max);\r\n }\r\n else if (initial) {\r\n defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height));\r\n initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom;\r\n _setZoomerVal.call(self, initialZoom);\r\n }\r\n\r\n dispatchChange(zoomer);\r\n }\r\n\r\n function _bindPoints(points) {\r\n if (points.length !== 4) {\r\n throw \"Croppie - Invalid number of points supplied: \" + points;\r\n }\r\n var self = this,\r\n pointsWidth = points[2] - points[0],\r\n // pointsHeight = points[3] - points[1],\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n vpOffset = {\r\n left: vpData.left - boundRect.left,\r\n top: vpData.top - boundRect.top\r\n },\r\n scale = vpData.width / pointsWidth,\r\n originTop = points[1],\r\n originLeft = points[0],\r\n transformTop = (-1 * points[1]) + vpOffset.top,\r\n transformLeft = (-1 * points[0]) + vpOffset.left,\r\n newCss = {};\r\n\r\n newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px';\r\n newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString();\r\n css(self.elements.preview, newCss);\r\n\r\n _setZoomerVal.call(self, scale);\r\n self._currentZoom = scale;\r\n }\r\n\r\n function _centerImage() {\r\n var self = this,\r\n imgDim = self.elements.preview.getBoundingClientRect(),\r\n vpDim = self.elements.viewport.getBoundingClientRect(),\r\n boundDim = self.elements.boundary.getBoundingClientRect(),\r\n vpLeft = vpDim.left - boundDim.left,\r\n vpTop = vpDim.top - boundDim.top,\r\n w = vpLeft - ((imgDim.width - vpDim.width) / 2),\r\n h = vpTop - ((imgDim.height - vpDim.height) / 2),\r\n transform = new Transform(w, h, self._currentZoom);\r\n\r\n css(self.elements.preview, CSS_TRANSFORM, transform.toString());\r\n }\r\n\r\n function _transferImageToCanvas(customOrientation) {\r\n var self = this,\r\n canvas = self.elements.canvas,\r\n img = self.elements.img,\r\n ctx = canvas.getContext('2d');\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n var orientation = self.options.enableOrientation && customOrientation || getExifOrientation(img);\r\n drawCanvas(canvas, img, orientation);\r\n }\r\n\r\n function _getCanvas(data) {\r\n var self = this,\r\n points = data.points,\r\n left = num(points[0]),\r\n top = num(points[1]),\r\n right = num(points[2]),\r\n bottom = num(points[3]),\r\n width = right-left,\r\n height = bottom-top,\r\n circle = data.circle,\r\n canvas = document.createElement('canvas'),\r\n ctx = canvas.getContext('2d'),\r\n startX = 0,\r\n startY = 0,\r\n canvasWidth = data.outputWidth || width,\r\n canvasHeight = data.outputHeight || height;\r\n\r\n canvas.width = canvasWidth;\r\n canvas.height = canvasHeight;\r\n\r\n if (data.backgroundColor) {\r\n ctx.fillStyle = data.backgroundColor;\r\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\r\n }\r\n\r\n // By default assume we're going to draw the entire\r\n // source image onto the destination canvas.\r\n var sx = left,\r\n sy = top,\r\n sWidth = width,\r\n sHeight = height,\r\n dx = 0,\r\n dy = 0,\r\n dWidth = canvasWidth,\r\n dHeight = canvasHeight;\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the x-axis.\r\n // Handle translations when projecting onto the destination canvas.\r\n //\r\n\r\n // The smallest possible source x-position is 0.\r\n if (left < 0) {\r\n sx = 0;\r\n dx = (Math.abs(left) / width) * canvasWidth;\r\n }\r\n\r\n // The largest possible source width is the original image's width.\r\n if (sWidth + sx > self._originalImageWidth) {\r\n sWidth = self._originalImageWidth - sx;\r\n dWidth = (sWidth / width) * canvasWidth;\r\n }\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the y-axis.\r\n //\r\n\r\n // The smallest possible source y-position is 0.\r\n if (top < 0) {\r\n sy = 0;\r\n dy = (Math.abs(top) / height) * canvasHeight;\r\n }\r\n\r\n // The largest possible source height is the original image's height.\r\n if (sHeight + sy > self._originalImageHeight) {\r\n sHeight = self._originalImageHeight - sy;\r\n dHeight = (sHeight / height) * canvasHeight;\r\n }\r\n\r\n // console.table({ left, right, top, bottom, canvasWidth, canvasHeight, width, height, startX, startY, circle, sx, sy, dx, dy, sWidth, sHeight, dWidth, dHeight });\r\n\r\n ctx.drawImage(this.elements.preview, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\r\n if (circle) {\r\n ctx.fillStyle = '#fff';\r\n ctx.globalCompositeOperation = 'destination-in';\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2, true);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n return canvas;\r\n }\r\n\r\n function _getHtmlResult(data) {\r\n var points = data.points,\r\n div = document.createElement('div'),\r\n img = document.createElement('img'),\r\n width = points[2] - points[0],\r\n height = points[3] - points[1];\r\n\r\n addClass(div, 'croppie-result');\r\n div.appendChild(img);\r\n css(img, {\r\n left: (-1 * points[0]) + 'px',\r\n top: (-1 * points[1]) + 'px'\r\n });\r\n img.src = data.url;\r\n css(div, {\r\n width: width + 'px',\r\n height: height + 'px'\r\n });\r\n\r\n return div;\r\n }\r\n\r\n function _getBase64Result(data) {\r\n return _getCanvas.call(this, data).toDataURL(data.format, data.quality);\r\n }\r\n\r\n function _getBlobResult(data) {\r\n var self = this;\r\n return new Promise(function (resolve) {\r\n _getCanvas.call(self, data).toBlob(function (blob) {\r\n resolve(blob);\r\n }, data.format, data.quality);\r\n });\r\n }\r\n\r\n function _replaceImage(img) {\r\n if (this.elements.img.parentNode) {\r\n Array.prototype.forEach.call(this.elements.img.classList, function(c) { img.classList.add(c); });\r\n this.elements.img.parentNode.replaceChild(img, this.elements.img);\r\n this.elements.preview = img; // if the img is attached to the DOM, they're not using the canvas\r\n }\r\n this.elements.img = img;\r\n }\r\n\r\n function _bind(options, cb) {\r\n var self = this,\r\n url,\r\n points = [],\r\n zoom = null,\r\n hasExif = _hasExif.call(self);\r\n\r\n if (typeof (options) === 'string') {\r\n url = options;\r\n options = {};\r\n }\r\n else if (Array.isArray(options)) {\r\n points = options.slice();\r\n }\r\n else if (typeof (options) === 'undefined' && self.data.url) { //refreshing\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n return null;\r\n }\r\n else {\r\n url = options.url;\r\n points = options.points || [];\r\n zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom;\r\n }\r\n\r\n self.data.bound = false;\r\n self.data.url = url || self.data.url;\r\n self.data.boundZoom = zoom;\r\n\r\n return loadImage(url, hasExif).then(function (img) {\r\n _replaceImage.call(self, img);\r\n if (!points.length) {\r\n var natDim = naturalImageDimensions(img);\r\n var rect = self.elements.viewport.getBoundingClientRect();\r\n var aspectRatio = rect.width / rect.height;\r\n var imgAspectRatio = natDim.width / natDim.height;\r\n var width, height;\r\n\r\n if (imgAspectRatio > aspectRatio) {\r\n height = natDim.height;\r\n width = height * aspectRatio;\r\n }\r\n else {\r\n width = natDim.width;\r\n height = natDim.height / aspectRatio;\r\n }\r\n\r\n var x0 = (natDim.width - width) / 2;\r\n var y0 = (natDim.height - height) / 2;\r\n var x1 = x0 + width;\r\n var y1 = y0 + height;\r\n self.data.points = [x0, y0, x1, y1];\r\n }\r\n else if (self.options.relative) {\r\n points = [\r\n points[0] * img.naturalWidth / 100,\r\n points[1] * img.naturalHeight / 100,\r\n points[2] * img.naturalWidth / 100,\r\n points[3] * img.naturalHeight / 100\r\n ];\r\n }\r\n\r\n self.data.points = points.map(function (p) {\r\n return parseFloat(p);\r\n });\r\n if (self.options.useCanvas) {\r\n _transferImageToCanvas.call(self, options.orientation);\r\n }\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n cb && cb();\r\n });\r\n }\r\n\r\n function fix(v, decimalPoints) {\r\n return parseFloat(v).toFixed(decimalPoints || 0);\r\n }\r\n\r\n function _get() {\r\n var self = this,\r\n imgData = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n x1 = vpData.left - imgData.left,\r\n y1 = vpData.top - imgData.top,\r\n widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border\r\n heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2,\r\n x2 = x1 + self.elements.viewport.offsetWidth + widthDiff,\r\n y2 = y1 + self.elements.viewport.offsetHeight + heightDiff,\r\n scale = self._currentZoom;\r\n\r\n if (scale === Infinity || isNaN(scale)) {\r\n scale = 1;\r\n }\r\n\r\n var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY;\r\n x1 = Math.max(max, x1 / scale);\r\n y1 = Math.max(max, y1 / scale);\r\n x2 = Math.max(max, x2 / scale);\r\n y2 = Math.max(max, y2 / scale);\r\n\r\n return {\r\n points: [fix(x1), fix(y1), fix(x2), fix(y2)],\r\n zoom: scale,\r\n orientation: self.data.orientation\r\n };\r\n }\r\n\r\n var RESULT_DEFAULTS = {\r\n type: 'canvas',\r\n format: 'png',\r\n quality: 1\r\n },\r\n RESULT_FORMATS = ['jpeg', 'webp', 'png'];\r\n\r\n function _result(options) {\r\n var self = this,\r\n data = _get.call(self),\r\n opts = deepExtend(clone(RESULT_DEFAULTS), clone(options)),\r\n resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')),\r\n size = opts.size || 'viewport',\r\n format = opts.format,\r\n quality = opts.quality,\r\n backgroundColor = opts.backgroundColor,\r\n circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'),\r\n vpRect = self.elements.viewport.getBoundingClientRect(),\r\n ratio = vpRect.width / vpRect.height,\r\n prom;\r\n\r\n if (size === 'viewport') {\r\n data.outputWidth = vpRect.width;\r\n data.outputHeight = vpRect.height;\r\n } else if (typeof size === 'object') {\r\n if (size.width && size.height) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.height;\r\n } else if (size.width) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.width / ratio;\r\n } else if (size.height) {\r\n data.outputWidth = size.height * ratio;\r\n data.outputHeight = size.height;\r\n }\r\n }\r\n\r\n if (RESULT_FORMATS.indexOf(format) > -1) {\r\n data.format = 'image/' + format;\r\n data.quality = quality;\r\n }\r\n\r\n data.circle = circle;\r\n data.url = self.data.url;\r\n data.backgroundColor = backgroundColor;\r\n\r\n prom = new Promise(function (resolve) {\r\n switch(resultType.toLowerCase())\r\n {\r\n case 'rawcanvas':\r\n resolve(_getCanvas.call(self, data));\r\n break;\r\n case 'canvas':\r\n case 'base64':\r\n resolve(_getBase64Result.call(self, data));\r\n break;\r\n case 'blob':\r\n _getBlobResult.call(self, data).then(resolve);\r\n break;\r\n default:\r\n resolve(_getHtmlResult.call(self, data));\r\n break;\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n function _refresh() {\r\n _updatePropertiesFromImage.call(this);\r\n }\r\n\r\n function _rotate(deg) {\r\n if (!this.options.useCanvas || !this.options.enableOrientation) {\r\n throw 'Croppie: Cannot rotate without enableOrientation && EXIF.js included';\r\n }\r\n\r\n var self = this,\r\n canvas = self.elements.canvas;\r\n\r\n self.data.orientation = getExifOffset(self.data.orientation, deg);\r\n drawCanvas(canvas, self.elements.img, self.data.orientation);\r\n _updateCenterPoint.call(self, true);\r\n _updateZoomLimits.call(self);\r\n }\r\n\r\n function _destroy() {\r\n var self = this;\r\n self.element.removeChild(self.elements.boundary);\r\n removeClass(self.element, 'croppie-container');\r\n if (self.options.enableZoom) {\r\n self.element.removeChild(self.elements.zoomerWrap);\r\n }\r\n delete self.elements;\r\n }\r\n\r\n if (window.jQuery) {\r\n var $ = window.jQuery;\r\n $.fn.croppie = function (opts) {\r\n var ot = typeof opts;\r\n\r\n if (ot === 'string') {\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n var singleInst = $(this).data('croppie');\r\n\r\n if (opts === 'get') {\r\n return singleInst.get();\r\n }\r\n else if (opts === 'result') {\r\n return singleInst.result.apply(singleInst, args);\r\n }\r\n else if (opts === 'bind') {\r\n return singleInst.bind.apply(singleInst, args);\r\n }\r\n\r\n return this.each(function () {\r\n var i = $(this).data('croppie');\r\n if (!i) return;\r\n\r\n var method = i[opts];\r\n if ($.isFunction(method)) {\r\n method.apply(i, args);\r\n if (opts === 'destroy') {\r\n $(this).removeData('croppie');\r\n }\r\n }\r\n else {\r\n throw 'Croppie ' + opts + ' method not found';\r\n }\r\n });\r\n }\r\n else {\r\n return this.each(function () {\r\n var i = new Croppie(this, opts);\r\n i.$ = $;\r\n $(this).data('croppie', i);\r\n });\r\n }\r\n };\r\n }\r\n\r\n function Croppie(element, opts) {\r\n if (element.className.indexOf('croppie-container') > -1) {\r\n throw new Error(\"Croppie: Can't initialize croppie more than once\");\r\n }\r\n this.element = element;\r\n this.options = deepExtend(clone(Croppie.defaults), opts);\r\n\r\n if (this.element.tagName.toLowerCase() === 'img') {\r\n var origImage = this.element;\r\n addClass(origImage, 'cr-original-image');\r\n setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' });\r\n var replacementDiv = document.createElement('div');\r\n this.element.parentNode.appendChild(replacementDiv);\r\n replacementDiv.appendChild(origImage);\r\n this.element = replacementDiv;\r\n this.options.url = this.options.url || origImage.src;\r\n }\r\n\r\n _create.call(this);\r\n if (this.options.url) {\r\n var bindOpts = {\r\n url: this.options.url,\r\n points: this.options.points\r\n };\r\n delete this.options['url'];\r\n delete this.options['points'];\r\n _bind.call(this, bindOpts);\r\n }\r\n }\r\n\r\n Croppie.defaults = {\r\n viewport: {\r\n width: 100,\r\n height: 100,\r\n type: 'square'\r\n },\r\n boundary: { },\r\n orientationControls: {\r\n enabled: true,\r\n leftClass: '',\r\n rightClass: ''\r\n },\r\n resizeControls: {\r\n width: true,\r\n height: true\r\n },\r\n customClass: '',\r\n showZoomer: true,\r\n enableZoom: true,\r\n enableResize: false,\r\n mouseWheelZoom: true,\r\n enableExif: false,\r\n enforceBoundary: true,\r\n enableOrientation: false,\r\n enableKeyMovement: true,\r\n update: function () { }\r\n };\r\n\r\n Croppie.globals = {\r\n translate: 'translate3d'\r\n };\r\n\r\n deepExtend(Croppie.prototype, {\r\n bind: function (options, cb) {\r\n return _bind.call(this, options, cb);\r\n },\r\n get: function () {\r\n var data = _get.call(this);\r\n var points = data.points;\r\n if (this.options.relative) {\r\n points[0] /= this.elements.img.naturalWidth / 100;\r\n points[1] /= this.elements.img.naturalHeight / 100;\r\n points[2] /= this.elements.img.naturalWidth / 100;\r\n points[3] /= this.elements.img.naturalHeight / 100;\r\n }\r\n return data;\r\n },\r\n result: function (type) {\r\n return _result.call(this, type);\r\n },\r\n refresh: function () {\r\n return _refresh.call(this);\r\n },\r\n setZoom: function (v) {\r\n _setZoomerVal.call(this, v);\r\n dispatchChange(this.elements.zoomer);\r\n },\r\n rotate: function (deg) {\r\n _rotate.call(this, deg);\r\n },\r\n destroy: function () {\r\n return _destroy.call(this);\r\n }\r\n });\r\n return Croppie;\r\n}));\r\n","var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a \ No newline at end of file +Telegram
\ No newline at end of file diff --git a/dist/main.27880027149f405d7924.css b/dist/main.31e7e79c726302d58b04.css similarity index 86% rename from dist/main.27880027149f405d7924.css rename to dist/main.31e7e79c726302d58b04.css index 7d13be4c7..470f977e4 100644 --- a/dist/main.27880027149f405d7924.css +++ b/dist/main.31e7e79c726302d58b04.css @@ -1 +1 @@ -#UiLoader{height:100%}@media (max-width:600px){#UiLoader{height:calc(var(--vh, 1vh)*100)}}#UiLoader .mask{position:fixed;top:0;left:0;right:0;margin:0 auto;width:100%;max-width:1680px;height:100%;z-index:var(--z-ui-loader-mask);display:flex}#UiLoader .mask .left{flex:1;background:var(--color-background);min-width:15.5rem;max-width:26.5rem}@media (min-width:1680px){#UiLoader .mask .left{border-left:1px solid var(--color-borders)}}@media (max-width:1275px){#UiLoader .mask .left{flex:2}}@media (max-width:925px){#UiLoader .mask .left{min-width:26.5rem}}@media (max-width:600px){#UiLoader .mask .left{max-width:none;width:100vw}}#UiLoader .mask .middle{flex:3;border-left:1px solid var(--color-borders);border-right:1px solid var(--color-borders);position:relative;z-index:1;overflow:hidden}#UiLoader .mask .middle:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background:no-repeat 50%;background-size:cover;z-index:-1;transform-origin:left center}.theme-dark body.initial #UiLoader .mask .middle:before{background-color:#0f0f0f}.theme-light body.initial #UiLoader .mask .middle:before,body:not(.initial) #UiLoader .mask .middle:before{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}#UiLoader .mask .middle.with-right-column:before{transform:scale(.67)}@media screen and (min-width:1276px){#UiLoader .mask .middle:before{margin:-16rem -5rem -20rem 0}}#UiLoader .mask .middle.custom-bg-image:before{margin:-1rem;background-image:none!important}@media (max-width:1275px){#UiLoader .mask .middle{flex:3;border-right:none}}@media (max-width:600px){#UiLoader .mask .middle{display:none}}#UiLoader .mask .right{position:absolute;top:0;right:0;z-index:1;height:100%;width:var(--right-column-width);min-width:15.5rem;max-width:26.5rem;border-left:1px solid var(--color-borders);background:var(--color-background)}#UiLoader .blank{flex:1;background:var(--color-background)}.Spinner{--spinner-size:2rem;position:relative;display:flex;align-items:center;justify-content:center;width:var(--spinner-size);height:var(--spinner-size)}.Spinner>div{position:absolute;top:0;left:0;right:0;bottom:0;background-repeat:no-repeat;background-size:100%;animation-name:spin;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}.Spinner.with-background:before{content:"";position:absolute;left:-.125rem;top:-.125rem;bottom:-.125rem;right:-.125rem;border-radius:50%;background:rgba(0,0,0,.25)}.Spinner.white>div{background-image:var(--spinner-white-data)}.Spinner.white.with-background>div{background-image:var(--spinner-white-thin-data)}.Spinner.blue>div{background-image:var(--spinner-blue-data)}.theme-dark .Spinner.blue>div{background-image:var(--spinner-dark-blue-data)}.Spinner.black>div{background-image:var(--spinner-black-data)}.Spinner.green>div{background-image:var(--spinner-green-data)}.Spinner.gray>div{background-image:var(--spinner-gray-data)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes ripple-animation{0%{transform:scale(0);opacity:1}50%{opacity:1}to{opacity:0;transform:scale(2)}}.ripple-container{position:absolute;top:0;left:0;bottom:0;right:0}body.animation-level-0 .ripple-container{display:none}.ripple-container span{position:absolute;display:block;background-color:var(--ripple-color,rgba(0,0,0,.08));border-radius:50%;transform:scale(0);animation:ripple-animation .7s}.Button{outline:none!important;display:flex;align-items:center;justify-content:center;width:100%;height:3.5rem;border:0;border-radius:var(--border-radius-default);background:transparent;padding:.625rem;color:#fff;line-height:1.2;cursor:pointer;text-transform:uppercase;flex-shrink:0;position:relative;overflow:hidden;transition:background-color .15s,color .15s;text-decoration:none!important}.Button.clicked,.Button:active,body.animation-level-0 .Button{transition:none!important}.Button.disabled{opacity:.5!important;cursor:default;pointer-events:none}.Button.round{width:3.5rem;border-radius:50%}.Button.round i{font-size:1.5rem}.Button.primary{background:var(--color-primary);color:var(--color-white);--ripple-color:rgba(0,0,0,0.08)}.Button.primary:not(.disabled):not(:disabled).active,.Button.primary:not(.disabled):not(:disabled):active,.Button.primary:not(.disabled):not(:disabled):focus,.Button.primary:not(.disabled):not(:disabled):hover{background:var(--color-primary-shade)}body.animation-level-0 .Button.primary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade-darker)}.Button.secondary{background:var(--color-background);color:rgba(var(--color-text-secondary-rgb),.75);--ripple-color:rgba(0,0,0,0.08)}.Button.secondary:not(.disabled):not(:disabled).active,.Button.secondary:not(.disabled):not(:disabled):active,.Button.secondary:not(.disabled):not(:disabled):focus,.Button.secondary:not(.disabled):not(:disabled):hover{background:var(--color-primary);color:#fff}body.animation-level-0 .Button.secondary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade)}.Button.gray{background:var(--color-background);color:var(--color-text-secondary);--ripple-color:rgba(0,0,0,0.08)}.Button.gray:not(.disabled):not(:disabled).active,.Button.gray:not(.disabled):not(:disabled):active,.Button.gray:not(.disabled):not(:disabled):focus,.Button.gray:not(.disabled):not(:disabled):hover{color:var(--color-primary)}body.animation-level-0 .Button.gray:not(.disabled):not(:disabled):active{background:var(--color-chat-hover)}.Button.danger{background:var(--color-background);color:var(--color-error);--ripple-color:rgba(var(--color-error-rgb),.16)}.Button.danger:not(.disabled):not(:disabled).active,.Button.danger:not(.disabled):not(:disabled):active,.Button.danger:not(.disabled):not(:disabled):focus,.Button.danger:not(.disabled):not(:disabled):hover{background:var(--color-error);color:var(--color-white)}body.animation-level-0 .Button.danger:not(.disabled):not(:disabled):active{background:var(--color-error-shade)}.Button.text{background:none}.Button.text.primary{color:var(--color-primary);background:none}.Button.text.primary:not(.disabled):not(:disabled).active,.Button.text.primary:not(.disabled):not(:disabled):active,.Button.text.primary:not(.disabled):not(:disabled):focus,.Button.text.primary:not(.disabled):not(:disabled):hover{background:rgba(var(--color-primary-shade-rgb),.08)}body.animation-level-0 .Button.text.primary:not(.disabled):not(:disabled):active{background:rgba(var(--color-primary-shade-rgb),.16)}.Button.text.secondary{background:none;color:var(--color-text-secondary)}.Button.text.danger:not(.disabled):not(:disabled).active,.Button.text.danger:not(.disabled):not(:disabled):active,.Button.text.danger:not(.disabled):not(:disabled):focus,.Button.text.danger:not(.disabled):not(:disabled):hover{background:rgba(var(--color-error-rgb),.08);color:var(--color-error)}body.animation-level-0 .Button.text.danger:not(.disabled):not(:disabled):active{background:rgba(var(--color-error-rgb),.16)}.Button.faded{opacity:.75}.Button.faded.activated,.Button.faded:not(.disabled):not(:disabled).active,.Button.faded:not(.disabled):not(:disabled):active,.Button.faded:not(.disabled):not(:disabled):focus,.Button.faded:not(.disabled):not(:disabled):hover{opacity:1}.Button.translucent{background-color:initial;color:var(--color-text-secondary);--ripple-color:rgba(var(--color-text-secondary-rgb),0.08)}.Button.translucent:not(.disabled):not(:disabled).active,.Button.translucent:not(.disabled):not(:disabled):active,.Button.translucent:not(.disabled):not(:disabled):focus,.Button.translucent:not(.disabled):not(:disabled):hover{background-color:rgba(var(--color-text-secondary-rgb),.08)}body.animation-level-0 .Button.translucent:not(.disabled):not(:disabled):active{background-color:rgba(var(--color-text-secondary-rgb),.16)}.Button.translucent.activated{color:var(--color-primary)}.Button.translucent-white{background-color:initial;color:hsla(0,0%,100%,.5);--ripple-color:hsla(0,0%,100%,0.08)}.Button.translucent-white:not(.disabled):not(:disabled).active,.Button.translucent-white:not(.disabled):not(:disabled):active,.Button.translucent-white:not(.disabled):not(:disabled):focus,.Button.translucent-white:not(.disabled):not(:disabled):hover{background-color:hsla(0,0%,100%,.08);color:#fff}body.animation-level-0 .Button.translucent-white:not(.disabled):not(:disabled):active{background-color:hsla(0,0%,100%,.16)}.Button.dark{background-color:rgba(0,0,0,.75);color:#fff;--ripple-color:hsla(0,0%,100%,0.08)}.Button.dark:not(.disabled):not(:disabled).active,.Button.dark:not(.disabled):not(:disabled):active,.Button.dark:not(.disabled):not(:disabled):focus,.Button.dark:not(.disabled):not(:disabled):hover{background-color:rgba(0,0,0,.85);color:#fff}body.animation-level-0 .Button.dark:not(.disabled):not(:disabled):active{background-color:rgba(0,0,0,.95)}.Button.smaller{height:2.75rem;padding:.3125rem}.Button.smaller.round{width:2.75rem}.Button.smaller.pill{height:2.5rem;border-radius:1.25rem;padding:.3125rem 1rem}.Button.smaller.with-icon{padding-left:.75rem;padding-right:1.25rem}.Button.smaller.with-icon i{font-size:1.5rem;margin-right:.5rem}@media (max-width:600px){.Button.smaller{height:2.5rem}.Button.smaller.round{width:2.5rem}}.Button.tiny{height:2.25rem;padding:.4375rem;border-radius:var(--border-radius-default-small);font-size:.875rem;font-weight:500}.Button.tiny.round{width:2.25rem;height:2.25rem;border-radius:50%}.Button.tiny i{font-size:1.25rem}.Button.tiny.pill{height:2rem;border-radius:1rem;padding:.3125rem 1rem;font-size:1rem}.Button.fluid{padding-left:1.75rem;padding-right:1.75rem;width:auto}.Button.fluid.tiny{padding-left:1.375rem;padding-right:1.375rem}.Button.pill{border-radius:1.75rem;padding-left:1.75rem;padding-right:1.75rem;text-transform:none}.Button.loading{position:relative;pointer-events:none}.Button.loading .Spinner{position:absolute;right:.875rem;top:.875rem;--spinner-size:1.8rem}.Button .emoji{vertical-align:-3px}.Menu.fluid .bubble{min-width:13.5rem;width:auto}.Menu .backdrop{position:fixed;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;z-index:var(--z-menu-backdrop)}.Menu .bubble{overflow:hidden;display:block;list-style:none;padding:.5rem 0;margin:0;position:absolute;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);min-width:13.5rem;z-index:var(--z-menu-bubble);transform:scale(.2);transition:opacity .2s cubic-bezier(.2,0,.2,1),transform .2s cubic-bezier(.2,0,.2,1)!important;--offset-y:calc(100% + 0.5rem);--offset-x:0}.Menu .bubble.open{transform:scale(1)}.Menu .bubble.closing{transition:opacity .2s ease-in,transform .2s ease-in!important}body.animation-level-0 .Menu .bubble{transform:none!important;transition:opacity .15s!important}body.has-open-dialog .Menu .bubble{transition:none!important}.Menu .bubble.top{top:var(--offset-y)}.Menu .bubble.bottom{bottom:var(--offset-y)}.Menu .bubble.left{left:var(--offset-x)}.Menu .bubble.right{right:var(--offset-x)}.Menu .bubble.with-footer{padding-bottom:0}.Menu .footer{padding:.5rem 0;background:var(--color-chat-hover);color:var(--color-text-secondary);font-size:.8125rem;text-align:center}.DropdownMenu,.MenuItem{position:relative}.MenuItem{width:100%;background:none;border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);--ripple-color:rgba(0,0,0,0.08);cursor:pointer}.MenuItem:focus,.MenuItem:hover{background-color:var(--color-chat-hover);text-decoration:none;color:inherit}.MenuItem i{font-size:1.5rem;color:var(--color-text-secondary)}.MenuItem .menu-item-name,.MenuItem i{margin-right:2rem}.MenuItem .menu-item-name.capitalize{text-transform:capitalize}.MenuItem.disabled{opacity:.5!important;cursor:default!important}.MenuItem.destructive{color:var(--color-error)}.MenuItem.destructive i{color:inherit}.MenuItem:not(.has-ripple):not(.disabled):active{background-color:var(--color-item-active);transition:none!important}.MenuItem>.Switcher{margin-left:auto}.CountryCodeInput .input-group{cursor:pointer;z-index:var(--z-country-code-input-group)}.CountryCodeInput .input-group .Spinner{position:absolute;top:1rem;right:.75rem;opacity:.5;--spinner-size:1.5rem}.CountryCodeInput .input-group .css-icon-down{position:absolute;top:1.125rem;right:1rem;width:.75rem;height:.75rem;border:2px solid var(--color-text-secondary);border-top:0;border-left:0;transform:scaleY(1) rotate(45deg);transition:color .2s ease,transform .2s ease,top .2s ease}.CountryCodeInput .input-group .css-icon-down.open{border-color:var(--color-primary);transform:scaleY(-1) rotate(45deg);top:1.5rem}.CountryCodeInput .bubble{width:100%;max-height:23.5rem;overflow-y:auto;transform-origin:top center!important;transform:scale(.95)}.CountryCodeInput .bubble.open{transform:scaleY(1)}.CountryCodeInput .MenuItem button{display:flex;align-items:center}.CountryCodeInput .MenuItem.no-results button{justify-content:center;padding:.5rem 1rem}.CountryCodeInput .MenuItem.no-results button span{font-size:.875rem}.CountryCodeInput .country-flag{font-size:2rem;margin-right:2rem}.CountryCodeInput .country-flag .emoji{width:2rem;height:2rem;display:inline-block;vertical-align:4px;margin:-.5rem .125rem}.CountryCodeInput .country-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:1rem;text-align:left}.CountryCodeInput .country-code{margin-left:auto;opacity:.5}.Checkbox{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Checkbox.disabled{pointer-events:none;opacity:.5}.Checkbox.round .Checkbox-main:before{border-radius:50%}.Checkbox.round .Checkbox-main:after{background:var(--color-primary) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=) no-repeat 50% 50%;background-size:12px;border-radius:50%}.Checkbox.loading .Checkbox-main:after,.Checkbox.loading .Checkbox-main:before{opacity:0!important}.Checkbox.loading .Spinner{position:absolute;left:.375rem;top:.125rem;opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Checkbox.blocking input:not(:checked)~.Checkbox-main:before{border-color:var(--color-error)}.Checkbox.blocking input:not(:checked)~.Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZmlsbD0iI2U1MzkzNSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTggM2EzIDMgMCAwMTMgM3YxMmEzIDMgMCAwMS0zIDNINmEzIDMgMCAwMS0zLTNWNmEzIDMgMCAwMTMtM2gxMnptLTIgOEg4YTEgMSAwIDAwMCAyaDhhMSAxIDAgMDAwLTJ6Ii8+PC9nPjwvc3ZnPg==);opacity:1;background-size:1.375rem;background-position:-.125rem -.125rem}.Checkbox input{position:absolute;z-index:var(--z-below);opacity:0}.Checkbox .Checkbox-main:after,.Checkbox .Checkbox-main:before{content:"";display:block;position:absolute;left:1.1875rem;top:.1875rem;width:1.125rem;height:1.125rem}.Checkbox .Checkbox-main:before{border:2px solid var(--color-borders);border-radius:.25rem;background-color:var(--color-white);transition:border-color .1s ease}.Checkbox .Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTE2LjcgMEMxOC41IDAgMjAgMS41IDIwIDMuM3YxMy4zYzAgMS44LTEuNSAzLjMtMy4zIDMuM0gzLjNDMS41IDIwIDAgMTguNSAwIDE2LjdWMy4zQzAgMS41IDEuNSAwIDMuMyAwaDEzLjR6bS0uOCA0LjhsLTguMSA4LjEtMy43LTMuN2MtLjQtLjQtMS4xLS40LTEuNiAwLS40LjQtLjQgMS4xIDAgMS42TDcgMTUuMmMuNC40IDEuMS40IDEuNiAwbDguOS04LjljLjQtLjQuNC0xLjEgMC0xLjYtLjUtLjQtMS4yLS40LTEuNi4xeiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);background-size:contain;background-repeat:no-repeat;opacity:0;transition:opacity .1s ease}.Checkbox .Checkbox-main .label{display:block}.Checkbox .Checkbox-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Checkbox input:checked~.Checkbox-main:before{border-color:var(--color-primary)}.Checkbox input:checked~.Checkbox-main:after{opacity:1}.Loading{display:flex;height:100%;align-items:center;justify-content:center}.Loading .Spinner{--spinner-size:2.75rem}.auth-form{width:100%;max-width:25.5rem;margin:0 auto;padding:6rem 1rem 1rem;text-align:center}@media (min-width:600px) and (min-height:450px){.auth-form{padding:6.8rem 1.5rem 1.5rem}}.auth-form #logo,.auth-form .AvatarEditable label{display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width:600px) and (min-height:450px){.auth-form #logo,.auth-form .AvatarEditable label{width:10rem;height:10rem;margin-bottom:2.5rem}}.auth-form #logo{background-size:100%;background:url(telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg) 50% no-repeat}.auth-form h2{font-size:1.25rem;line-height:1}@media (min-width:600px){.auth-form h2{font-size:2rem;line-height:1.5}}.auth-form .note{font-size:.875rem;line-height:1.35;margin-bottom:2.5rem;color:var(--color-text-secondary)}@media (min-width:600px){.auth-form .note{font-size:1rem;margin-bottom:3rem}}#auth-code-form,#auth-password-form,#auth-phone-number-form,#auth-qr-form,#auth-registration-form{height:100%;overflow-y:auto}#auth-phone-number-form form{min-height:26.25rem}#auth-phone-number-form .Button{margin-top:2.75rem}#auth-phone-number-form .Button+.Button{margin-top:1rem}#auth-code-form h2,#auth-password-form h2,.auth-number-edit{display:flex;align-items:center;justify-content:center}.auth-number-edit{width:2.5rem;height:2.5rem;padding:.5rem;font-size:1.5rem;color:var(--color-text-secondary);opacity:.75;cursor:pointer}.auth-number-edit:focus,.auth-number-edit:hover{opacity:1}#auth-qr-form .qr-container{height:280px;opacity:1;transform:scale(1);transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .3s}#auth-qr-form .qr-container.pre-animate{opacity:.5;transform:scale(.8)}#auth-qr-form h3{margin:1.5rem 0 1rem}#auth-qr-form ol{list-style:none;counter-reset:item;padding:0 2rem}#auth-qr-form ol li{counter-increment:item;text-align:left;margin:.75rem 0;display:flex}#auth-qr-form ol li:before{content:counter(item);display:flex;justify-content:center;align-items:center;min-width:1.4rem;height:1.4rem;padding:0;margin:0 .75rem 0 0;background:var(--color-primary);border-radius:50%;font-size:smaller;color:#fff}#sign-in-password{word-break:normal!important}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.499af208fa04aa805317cf014d869692.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.6b69287db14836e8ccee577d6457b127.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.350ec982325895563ada47d14c7936da.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.af30acd9d70ade5b828db02d25348da2.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.62afd8a72052ca925aafb4006fddff88.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.009379f5feecd3ef689ad46e029b31e6.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4mxKKTU1Kg.465390c6e54c60f4a15ff698f372e858.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.66efaee062df58309edc4cdfaef3f094.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.3e1bb90afe5eb4a94c5ffdb911fd21d0.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.acd64c8bf32762464b8f2c0600dc2b89.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.cab892ae9aa422233ea43db289e0c038.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.01bafbfbc1e4ebe0139d259614d5c12d.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.d3c211af53a789d2f9fd79599baca39a.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.324b1e6d0f5ae7c6ab42fed5516c7b3d.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:500}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:theme-color("primary");text-decoration:none;background-color:initial;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}:root{--color-background:#fff;--color-background-selected:#f4f4f5;--color-background-own:#eefedf;--color-background-own-selected:#d4fcae;--color-background-own-rgb:238,254,223;--color-text:#000;--color-text-lighter:#2e3939;--color-text-secondary:#707579;--color-text-secondary-rgb:112,117,121;--color-text-meta:#686c72;--color-text-meta-rgb:104,108,114;--color-text-meta-colored:#4fae4e;--color-text-green:#4fae4e;--color-text-green-rgb:79,174,78;--color-borders:#dadce0;--color-borders-input:#dadce0;--color-webpage-initial-background:#2e3939;--color-interactive-active:var(--color-primary);--color-interactive-inactive:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-buffered:rgba(var(--color-text-secondary-rgb),0.25);--color-primary:#50a2e9;--color-primary-rgb:80,162,233;--color-primary-shade:#4a95d6;--color-primary-shade-darker:#4388c4;--color-primary-shade-rgb:74,149,214;--color-primary-opacity:rgba(var(--color-primary),0.50);--color-green:#4dcd5e;--color-green-darker:#41ac4f;--color-error:#e53935;--color-error-shade:#d33431;--color-error-rgb:229,57,53;--color-warning:#fb8c00;--color-yellow:#fdd764;--color-links:#52a1ef;--color-links-hover:#2d8dec;--color-links-darker:#157be0;--color-links-darker-hover:#1166ba;--color-own-links:#fff;--color-placeholders:#a2acb4;--color-pinned:#fff;--color-code:#4a729a;--color-code-bg:rgba(112,117,121,0.08);--color-code-own:#3c7940;--color-code-own-bg:rgba(112,117,121,0.08);--color-accent-own:#4fae4e;--color-message-meta-own:#4fae4e;--color-reply-hover:#f4f4f4;--color-reply-active:#e8e9ea;--color-reply-own-hover:#dbf4ce;--color-reply-own-active:#c8ebbc;--color-white:#fff;--color-gray:#c4c9cc;--color-chat-hover:#f4f4f5;--color-chat-active:#5b90e0;--color-item-active:#ededed;--color-selection-highlight:#3993fb;--color-selection-highlight-emoji:rgba(57,147,251,0.7);--color-user-1:#e17076;--color-user-2:#7bc862;--color-user-4:#65aadd;--color-user-5:#a695e7;--color-user-6:#ee7aae;--color-user-7:#6ec9cb;--color-user-8:#faa774;--color-default-shadow:hsla(0,0%,44.7%,0.25);--color-light-shadow:hsla(0,0%,44.7%,0.17);--border-radius-default:0.75rem;--border-radius-default-small:0.625rem;--border-radius-default-tiny:0.375rem;--border-radius-messages:0.75rem;--border-radius-messages-small:0.375rem;--messages-container-width:45.5rem;--right-column-width:26.5rem;--header-height:3.625rem;--symbol-menu-width:26.25rem;--symbol-menu-height:23.25rem;--symbol-menu-footer-height:3rem;--z-ui-loader-mask:2000;--z-right-column:900;--z-header-menu:990;--z-header-menu-backdrop:980;--z-modal:1000;--z-media-viewer:1500;--z-drop-area:55;--z-notification:50;--z-animation-fade:50;--z-menu-bubble:21;--z-menu-backdrop:20;--z-message-highlighted:13;--z-message-context-menu:12;--z-mobile-search:11;--z-middle-header:10;--z-middle-footer:10;--z-country-code-input-group:10;--z-message-select-control:9;--z-message-select-area:8;--z-sticky-date:9;--z-register-add-avatar:5;--z-media-viewer-head:3;--z-below:-1;--spinner-white-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);--spinner-white-thin-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxVjBDNS40IDAgMCA1LjQgMCAxMnM1LjQgMTIgMTIgMTIgMTItNS40IDEyLTEyaC0xYzAgNi4xLTQuOSAxMS0xMSAxMXoiLz48L3N2Zz4=);--spinner-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);--spinner-dark-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzgzNzhEQiIvPjwvc3ZnPg==);--spinner-black-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzJlMzkzOSIvPjwvc3ZnPg==);--spinner-green-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRmYWU0ZSIvPjwvc3ZnPg==);--spinner-gray-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzcwNzU3OSIvPjwvc3ZnPg==);--drag-target-border:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--drag-target-border-hovered:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--layer-transition:300ms cubic-bezier(0.33,1,0.68,1);--layer-blackout-opacity:0.3;--slide-transition:450ms cubic-bezier(0.25,1,0.5,1);--select-transition:200ms ease-out;--vh:1vh}@media (min-width:1276px) and (max-width:1680px){:root{--right-column-width:25vw}}@media (max-width:600px){:root{--right-column-width:100vw;--header-height:3.5rem;--symbol-menu-width:100vw;--symbol-menu-height:14.6875rem;--layer-transition:450ms cubic-bezier(0.25,1,0.5,1)}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:2rem!important}.mt-5,.my-5{margin-top:2rem!important}.mr-5,.mx-5{margin-right:2rem!important}.mb-5,.my-5{margin-bottom:2rem!important}.ml-5,.mx-5{margin-left:2rem!important}.m-6{margin:3rem!important}.mt-6,.my-6{margin-top:3rem!important}.mr-6,.mx-6{margin-right:3rem!important}.mb-6,.my-6{margin-bottom:3rem!important}.ml-6,.mx-6{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:2rem!important}.pt-5,.py-5{padding-top:2rem!important}.pr-5,.px-5{padding-right:2rem!important}.pb-5,.py-5{padding-bottom:2rem!important}.pl-5,.px-5{padding-left:2rem!important}.p-6{padding:3rem!important}.pt-6,.py-6{padding-top:3rem!important}.pr-6,.px-6{padding-right:3rem!important}.pb-6,.py-6{padding-bottom:3rem!important}.pl-6,.px-6{padding-left:3rem!important}.input-group{position:relative;margin-bottom:1.5rem}.input-group label{display:block;padding:0 .25rem;position:absolute;left:.75rem;top:.95rem;background-color:var(--color-background);font-size:1rem;font-weight:400;color:var(--color-placeholders);transition:transform .15s ease-out,color .15s ease-out;cursor:text;pointer-events:none;transform-origin:left center;white-space:nowrap}.input-group.with-arrow:after{content:"";position:absolute;height:.75rem;width:.75rem;border-left:1px solid var(--color-text-secondary);border-bottom:1px solid var(--color-text-secondary);transform:rotate(-45deg);right:2rem;top:1rem}.input-group.error label,.input-group .form-control.focus+label,.input-group .form-control:focus+label,.input-group.success label,.input-group.touched label{transform:scale(.75) translate(-.5rem,-2.25rem)}.input-group .form-control::placeholder,.input-group input::placeholder{color:var(--color-placeholders)}.input-group.touched label{color:var(--color-text-secondary)}.input-group.error label{color:var(--color-error)!important}.input-group.success label{color:var(--color-text-green)!important}.input-group.disabled{opacity:.5;pointer-events:none}.form-control{--border-width:1px;display:block;width:100%;height:3.375rem;padding:calc(.75rem - var(--border-width)) calc(.9rem - var(--border-width));border:var(--border-width) solid var(--color-borders-input);border-radius:var(--border-radius-default);color:var(--color-text);background-color:var(--color-background);outline:none;transition:border-color .15s ease;word-break:break-word;-webkit-appearance:none;font-size:1rem;line-height:1.25rem}.form-control:hover{border-color:var(--color-primary)}.form-control:hover+label{color:var(--color-primary)}.form-control.focus,.form-control:focus{border-color:var(--color-primary);box-shadow:inset 0 0 0 1px var(--color-primary);caret-color:var(--color-primary)}.form-control.focus+label,.form-control:focus+label{color:var(--color-primary)}.form-control:disabled{background:none!important}.error .form-control{border-color:var(--color-error);box-shadow:inset 0 0 0 1px var(--color-error);caret-color:var(--color-error)}.success .form-control{border-color:var(--color-text-green);box-shadow:inset 0 0 0 1px var(--color-text-green);caret-color:var(--color-text-green)}select.form-control option{line-height:2rem}textarea.form-control{resize:none;overflow:hidden;line-height:1.3125rem;padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width))}.input-group.password-input{position:relative}.input-group.password-input .form-control{padding-right:3.375rem}.input-group.password-input .toggle-password{position:absolute;top:0;right:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none!important;color:var(--color-text-secondary);opacity:.7;font-size:1.5rem}.input-group.password-input .toggle-password:focus,.input-group.password-input .toggle-password:hover{opacity:1}@font-face{font-family:icomoon;src:url(icomoon.614a8c7d9a61b2762170dd8c484f6cbf.woff2) format("woff2"),url(icomoon.a3173a76102021a87cab628b6b1e6167.woff) format("woff");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bug:before{content:"\e97e"}.icon-data:before{content:"\e97d"}.icon-darkmode:before{content:"\e979"}.icon-animations:before{content:"\e97a"}.icon-enter:before{content:"\e97b"}.icon-fontsize:before{content:"\e97c"}.icon-permissions:before{content:"\e976"}.icon-card:before{content:"\e977"}.icon-truck:before{content:"\e978"}.icon-share-filled:before{content:"\e95a"}.icon-bold:before{content:"\e961"}.icon-bot-command:before{content:"\e962"}.icon-calendar-filter:before{content:"\e963"}.icon-comments:before{content:"\e964"}.icon-comments-sticker:before{content:"\e965"}.icon-arrow-down:before{content:"\e966"}.icon-email:before{content:"\e967"}.icon-italic:before{content:"\e968"}.icon-link:before{content:"\e969"}.icon-mention:before{content:"\e96a"}.icon-monospace:before{content:"\e96b"}.icon-next:before{content:"\e96c"}.icon-password-off:before{content:"\e96d"}.icon-pin-list:before{content:"\e96e"}.icon-previous:before{content:"\e96f"}.icon-replace:before{content:"\e970"}.icon-schedule:before{content:"\e971"}.icon-strikethrough:before{content:"\e972"}.icon-underlined:before{content:"\e973"}.icon-zoom-in:before{content:"\e974"}.icon-zoom-out:before{content:"\e975"}.icon-select:before{content:"\e960"}.icon-folder:before{content:"\e913"}.icon-bots:before{content:"\e915"}.icon-calendar:before{content:"\e916"}.icon-cloud-download:before{content:"\e917"}.icon-colorize:before{content:"\e918"}.icon-forward:before{content:"\e927"}.icon-reply:before{content:"\e947"}.icon-help:before{content:"\e92a"}.icon-info:before{content:"\e92b"}.icon-info-filled:before{content:"\e91b"}.icon-delete-filled:before{content:"\e91c"}.icon-delete:before{content:"\e91d"}.icon-edit:before{content:"\e923"}.icon-new-chat-filled:before{content:"\e939"}.icon-send:before{content:"\e94a"}.icon-send-outline:before{content:"\e94b"}.icon-add-user-filled:before{content:"\e904"}.icon-add-user:before{content:"\e905"}.icon-delete-user:before{content:"\e91e"}.icon-microphone:before{content:"\e935"}.icon-microphone-alt:before{content:"\e93b"}.icon-poll:before{content:"\e938"}.icon-revote:before{content:"\e93a"}.icon-photo:before{content:"\e940"}.icon-document:before{content:"\e91f"}.icon-camera:before{content:"\e90e"}.icon-camera-add:before{content:"\e90f"}.icon-logout:before{content:"\e932"}.icon-saved-messages:before{content:"\e948"}.icon-settings:before{content:"\e94e"}.icon-phone:before{content:"\e93f"}.icon-attach:before{content:"\e909"}.icon-copy:before{content:"\e91a"}.icon-channel:before{content:"\e911"}.icon-group:before{content:"\e929"}.icon-user:before{content:"\e959"}.icon-non-contacts:before{content:"\e928"}.icon-active-sessions:before{content:"\e902"}.icon-admin:before{content:"\e906"}.icon-download:before{content:"\e921"}.icon-location:before{content:"\e930"}.icon-stop:before{content:"\e952"}.icon-archive:before{content:"\e908"}.icon-unarchive:before{content:"\e953"}.icon-readchats:before{content:"\e933"}.icon-unread:before{content:"\e957"}.icon-message:before{content:"\e934"}.icon-lock:before{content:"\e931"}.icon-unlock:before{content:"\e954"}.icon-mute:before{content:"\e937"}.icon-unmute:before{content:"\e955"}.icon-pin:before{content:"\e941"}.icon-unpin:before{content:"\e956"}.icon-smallscreen:before{content:"\e95e"}.icon-fullscreen:before{content:"\e95f"}.icon-large-pause:before{content:"\e92e"}.icon-large-play:before{content:"\e92f"}.icon-pause:before{content:"\e93d"}.icon-play:before{content:"\e943"}.icon-channelviews:before{content:"\e912"}.icon-message-succeeded:before{content:"\e900"}.icon-message-read:before{content:"\e901"}.icon-message-pending:before{content:"\e94c"}.icon-message-failed:before{content:"\e94d"}.icon-favorite:before{content:"\e93e"}.icon-keyboard:before{content:"\e944"}.icon-delete-left:before{content:"\e945"}.icon-recent:before{content:"\e946"}.icon-gifs:before{content:"\e94f"}.icon-stickers:before{content:"\e95b"}.icon-smile:before{content:"\e950"}.icon-animals:before{content:"\e907"}.icon-eats:before{content:"\e922"}.icon-sport:before{content:"\e951"}.icon-car:before{content:"\e910"}.icon-lamp:before{content:"\e92c"}.icon-language:before{content:"\e92d"}.icon-flag:before{content:"\e926"}.icon-more:before{content:"\e936"}.icon-search:before{content:"\e949"}.icon-remove:before{content:"\e95c"}.icon-add:before{content:"\e903"}.icon-check:before{content:"\e914"}.icon-close:before{content:"\e919"}.icon-arrow-left:before{content:"\e90d"}.icon-arrow-right:before{content:"\e93c"}.icon-down:before{content:"\e920"}.icon-up:before{content:"\e958"}.icon-eye-closed:before{content:"\e925"}.icon-eye:before{content:"\e924"}.icon-muted-chat:before{content:"\e95d"}.icon-avatar-archived-chats:before{content:"\e90a"}.icon-avatar-deleted-account:before{content:"\e90b"}.icon-avatar-saved-messages:before{content:"\e90c"}.icon-pinned-chat:before{content:"\e942"}.media-inner{position:relative}.media-inner img,.media-inner video{display:block;object-fit:cover}.media-inner video{background:no-repeat 50% 50%;background-size:contain}.media-inner .media-loading,.media-inner .thumbnail~.full-media{position:absolute}.media-inner .thumbnail.empty{visibility:hidden}.animated-close-icon{position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform var(--slide-transition)}.animated-close-icon:after,.animated-close-icon:before{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}.animated-close-icon.no-transition,.animated-close-icon.no-transition:after,.animated-close-icon.no-transition:before{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.chat-list{height:100%;overflow-y:auto;padding:.5rem .125rem .5rem .4375rem}.chat-list .scroll-container{position:relative}.chat-list .ListItem.chat-item-clickable{margin:0}@media (max-width:600px){.chat-list{padding-left:0;padding-right:0}}.chat-list .no-results{color:var(--color-text-meta);margin-top:2rem;text-align:center}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeSpeed}body,html{width:100%;height:100%;background:var(--color-background);margin:0;padding:0;font-size:16px;font-family:Roboto,Helvetica Neue,Apple Color Emoji,sans-serif;color:var(--color-text);overflow:hidden}@media (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}body.cursor-grabbing,body.cursor-grabbing *{cursor:grabbing!important}#root{height:100%;max-width:1680px;margin:0 auto}@media (max-width:600px){#root{height:calc(var(--vh, 1vh)*100)}}#middle-column-portals,#portals{position:absolute;top:0;left:0;right:0}.hidden{visibility:hidden}.no-selection{user-select:none;-webkit-user-select:none!important}.visually-hidden{position:absolute!important;width:0;height:0;overflow:hidden;clip:rect(0,0,0,0);z-index:-1}.not-implemented{opacity:.5}.not-implemented,.not-implemented *{cursor:not-allowed!important}*{box-sizing:border-box}.disable-animations #root *{transition:none!important}.custom-scroll,.custom-scroll-x{scrollbar-width:thin;scrollbar-color:rgba(90,90,90,0) transparent;transition:scrollbar-color .3s ease;-webkit-overflow-scrolling:touch;pointer-events:auto}.custom-scroll-x::-webkit-scrollbar-thumb,.custom-scroll::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,0);border-radius:.35rem}.custom-scroll-x:focus,.custom-scroll-x:focus-within,.custom-scroll-x:hover,.custom-scroll:focus,.custom-scroll:focus-within,.custom-scroll:hover{scrollbar-color:rgba(90,90,90,.3) transparent}.custom-scroll-x:focus-within::-webkit-scrollbar-thumb,.custom-scroll-x:focus::-webkit-scrollbar-thumb,.custom-scroll-x:hover::-webkit-scrollbar-thumb,.custom-scroll:focus-within::-webkit-scrollbar-thumb,.custom-scroll:focus::-webkit-scrollbar-thumb,.custom-scroll:hover::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,.3)}.custom-scroll::-webkit-scrollbar{width:.375rem}.custom-scroll-x::-webkit-scrollbar{height:.35rem}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.emoji-small{background:no-repeat;background-size:1.25rem;color:transparent;display:inline-block;width:1.25rem;height:1.25rem;margin-right:1px;overflow:hidden}.emoji-small::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}div[role=button]{outline:none!important;cursor:pointer}.opacity-transition{opacity:1;transition:opacity .15s ease}.opacity-transition:not(.open){opacity:0}.opacity-transition:not(.shown){display:none}.opacity-transition.slow{transition-duration:.3s}.color-primary{color:var(--color-primary)!important}.color-danger{color:var(--color-error)!important}.text-muted{color:var(--color-text-secondary)!important}@keyframes grow-icon{0%{transform:scale(.5);opacity:.8}50%{transform:scale(1.1);opacity:1}to{transform:scale(1)}}@keyframes hide-icon{0%{transform:scale(1);opacity:.4}to{transform:scale(.5);opacity:0}} \ No newline at end of file +#UiLoader{height:100%}@media (max-width:600px){#UiLoader{height:calc(var(--vh, 1vh)*100)}}#UiLoader .mask{position:fixed;top:0;left:0;right:0;margin:0 auto;width:100%;max-width:1680px;height:100%;z-index:var(--z-ui-loader-mask);display:flex}#UiLoader .mask .left{flex:1;background:var(--color-background);min-width:15.5rem;max-width:26.5rem}@media (min-width:1680px){#UiLoader .mask .left{border-left:1px solid var(--color-borders)}}@media (max-width:1275px){#UiLoader .mask .left{flex:2}}@media (max-width:925px){#UiLoader .mask .left{min-width:26.5rem}}@media (max-width:600px){#UiLoader .mask .left{max-width:none;width:100vw}}#UiLoader .mask .middle{flex:3;border-left:1px solid var(--color-borders);border-right:1px solid var(--color-borders);position:relative;z-index:1;overflow:hidden}#UiLoader .mask .middle:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background:no-repeat 50%;background-size:cover;z-index:-1;transform-origin:left center}.theme-dark body.initial #UiLoader .mask .middle:before{background-color:#0f0f0f}.theme-light body.initial #UiLoader .mask .middle:before,body:not(.initial) #UiLoader .mask .middle:before{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}#UiLoader .mask .middle.with-right-column:before{transform:scale(.67)}@media screen and (min-width:1276px){#UiLoader .mask .middle:before{margin:-16rem -5rem -20rem 0}}#UiLoader .mask .middle.custom-bg-image:before{margin:-1rem;background-image:none!important}@media (max-width:1275px){#UiLoader .mask .middle{flex:3;border-right:none}}@media (max-width:600px){#UiLoader .mask .middle{display:none}}#UiLoader .mask .right{position:absolute;top:0;right:0;z-index:1;height:100%;width:var(--right-column-width);min-width:15.5rem;max-width:26.5rem;border-left:1px solid var(--color-borders);background:var(--color-background)}#UiLoader .blank{flex:1;background:var(--color-background)}.Spinner{--spinner-size:2rem;position:relative;display:flex;align-items:center;justify-content:center;width:var(--spinner-size);height:var(--spinner-size)}.Spinner>div{position:absolute;top:0;left:0;right:0;bottom:0;background-repeat:no-repeat;background-size:100%;animation-name:spin;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}.Spinner.with-background:before{content:"";position:absolute;left:-.125rem;top:-.125rem;bottom:-.125rem;right:-.125rem;border-radius:50%;background:rgba(0,0,0,.25)}.Spinner.white>div{background-image:var(--spinner-white-data)}.Spinner.white.with-background>div{background-image:var(--spinner-white-thin-data)}.Spinner.blue>div{background-image:var(--spinner-blue-data)}.theme-dark .Spinner.blue>div{background-image:var(--spinner-dark-blue-data)}.Spinner.black>div{background-image:var(--spinner-black-data)}.Spinner.green>div{background-image:var(--spinner-green-data)}.Spinner.gray>div{background-image:var(--spinner-gray-data)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes ripple-animation{0%{transform:scale(0);opacity:1}50%{opacity:1}to{opacity:0;transform:scale(2)}}.ripple-container{position:absolute;top:0;left:0;bottom:0;right:0}body.animation-level-0 .ripple-container{display:none}.ripple-container span{position:absolute;display:block;background-color:var(--ripple-color,rgba(0,0,0,.08));border-radius:50%;transform:scale(0);animation:ripple-animation .7s}.Button{outline:none!important;display:flex;align-items:center;justify-content:center;width:100%;height:3.5rem;border:0;border-radius:var(--border-radius-default);background:transparent;padding:.625rem;color:#fff;line-height:1.2;cursor:pointer;text-transform:uppercase;flex-shrink:0;position:relative;overflow:hidden;transition:background-color .15s,color .15s;text-decoration:none!important}.Button.clicked,.Button:active,body.animation-level-0 .Button{transition:none!important}.Button.disabled{opacity:.5!important;cursor:default;pointer-events:none}.Button.round{width:3.5rem;border-radius:50%}.Button.round i{font-size:1.5rem}.Button.primary{background:var(--color-primary);color:var(--color-white);--ripple-color:rgba(0,0,0,0.08)}.Button.primary:not(.disabled):not(:disabled).active,.Button.primary:not(.disabled):not(:disabled):active,.Button.primary:not(.disabled):not(:disabled):focus,.Button.primary:not(.disabled):not(:disabled):hover{background:var(--color-primary-shade)}body.animation-level-0 .Button.primary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade-darker)}.Button.secondary{background:var(--color-background);color:rgba(var(--color-text-secondary-rgb),.75);--ripple-color:rgba(0,0,0,0.08)}.Button.secondary:not(.disabled):not(:disabled).active,.Button.secondary:not(.disabled):not(:disabled):active,.Button.secondary:not(.disabled):not(:disabled):focus,.Button.secondary:not(.disabled):not(:disabled):hover{background:var(--color-primary);color:#fff}body.animation-level-0 .Button.secondary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade)}.Button.gray{background:var(--color-background);color:var(--color-text-secondary);--ripple-color:rgba(0,0,0,0.08)}.Button.gray:not(.disabled):not(:disabled).active,.Button.gray:not(.disabled):not(:disabled):active,.Button.gray:not(.disabled):not(:disabled):focus,.Button.gray:not(.disabled):not(:disabled):hover{color:var(--color-primary)}body.animation-level-0 .Button.gray:not(.disabled):not(:disabled):active{background:var(--color-chat-hover)}.Button.danger{background:var(--color-background);color:var(--color-error);--ripple-color:rgba(var(--color-error-rgb),.16)}.Button.danger:not(.disabled):not(:disabled).active,.Button.danger:not(.disabled):not(:disabled):active,.Button.danger:not(.disabled):not(:disabled):focus,.Button.danger:not(.disabled):not(:disabled):hover{background:var(--color-error);color:var(--color-white)}body.animation-level-0 .Button.danger:not(.disabled):not(:disabled):active{background:var(--color-error-shade)}.Button.text{background:none}.Button.text.primary{color:var(--color-primary);background:none}.Button.text.primary:not(.disabled):not(:disabled).active,.Button.text.primary:not(.disabled):not(:disabled):active,.Button.text.primary:not(.disabled):not(:disabled):focus,.Button.text.primary:not(.disabled):not(:disabled):hover{background:rgba(var(--color-primary-shade-rgb),.08)}body.animation-level-0 .Button.text.primary:not(.disabled):not(:disabled):active{background:rgba(var(--color-primary-shade-rgb),.16)}.Button.text.secondary{background:none;color:var(--color-text-secondary)}.Button.text.danger:not(.disabled):not(:disabled).active,.Button.text.danger:not(.disabled):not(:disabled):active,.Button.text.danger:not(.disabled):not(:disabled):focus,.Button.text.danger:not(.disabled):not(:disabled):hover{background:rgba(var(--color-error-rgb),.08);color:var(--color-error)}body.animation-level-0 .Button.text.danger:not(.disabled):not(:disabled):active{background:rgba(var(--color-error-rgb),.16)}.Button.faded{opacity:.75}.Button.faded.activated,.Button.faded:not(.disabled):not(:disabled).active,.Button.faded:not(.disabled):not(:disabled):active,.Button.faded:not(.disabled):not(:disabled):focus,.Button.faded:not(.disabled):not(:disabled):hover{opacity:1}.Button.translucent{background-color:initial;color:var(--color-text-secondary);--ripple-color:rgba(var(--color-text-secondary-rgb),0.08)}.Button.translucent:not(.disabled):not(:disabled).active,.Button.translucent:not(.disabled):not(:disabled):active,.Button.translucent:not(.disabled):not(:disabled):focus,.Button.translucent:not(.disabled):not(:disabled):hover{background-color:rgba(var(--color-text-secondary-rgb),.08)}body.animation-level-0 .Button.translucent:not(.disabled):not(:disabled):active{background-color:rgba(var(--color-text-secondary-rgb),.16)}.Button.translucent.activated{color:var(--color-primary)}.Button.translucent-white{background-color:initial;color:hsla(0,0%,100%,.5);--ripple-color:hsla(0,0%,100%,0.08)}.Button.translucent-white:not(.disabled):not(:disabled).active,.Button.translucent-white:not(.disabled):not(:disabled):active,.Button.translucent-white:not(.disabled):not(:disabled):focus,.Button.translucent-white:not(.disabled):not(:disabled):hover{background-color:hsla(0,0%,100%,.08);color:#fff}body.animation-level-0 .Button.translucent-white:not(.disabled):not(:disabled):active{background-color:hsla(0,0%,100%,.16)}.Button.dark{background-color:rgba(0,0,0,.75);color:#fff;--ripple-color:hsla(0,0%,100%,0.08)}.Button.dark:not(.disabled):not(:disabled).active,.Button.dark:not(.disabled):not(:disabled):active,.Button.dark:not(.disabled):not(:disabled):focus,.Button.dark:not(.disabled):not(:disabled):hover{background-color:rgba(0,0,0,.85);color:#fff}body.animation-level-0 .Button.dark:not(.disabled):not(:disabled):active{background-color:rgba(0,0,0,.95)}.Button.smaller{height:2.75rem;padding:.3125rem}.Button.smaller.round{width:2.75rem}.Button.smaller.pill{height:2.5rem;border-radius:1.25rem;padding:.3125rem 1rem}.Button.smaller.with-icon{padding-left:.75rem;padding-right:1.25rem}.Button.smaller.with-icon i{font-size:1.5rem;margin-right:.5rem}@media (max-width:600px){.Button.smaller{height:2.5rem}.Button.smaller.round{width:2.5rem}}.Button.tiny{height:2.25rem;padding:.4375rem;border-radius:var(--border-radius-default-small);font-size:.875rem;font-weight:500}.Button.tiny.round{width:2.25rem;height:2.25rem;border-radius:50%}.Button.tiny i{font-size:1.25rem}.Button.tiny.pill{height:2rem;border-radius:1rem;padding:.3125rem 1rem;font-size:1rem}.Button.fluid{padding-left:1.75rem;padding-right:1.75rem;width:auto}.Button.fluid.tiny{padding-left:1.375rem;padding-right:1.375rem}.Button.pill{border-radius:1.75rem;padding-left:1.75rem;padding-right:1.75rem;text-transform:none}.Button.loading{position:relative;pointer-events:none}.Button.loading .Spinner{position:absolute;right:.875rem;top:.875rem;--spinner-size:1.8rem}.Button .emoji{vertical-align:-3px}.Checkbox{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Checkbox.disabled{pointer-events:none;opacity:.5}.Checkbox.round .Checkbox-main:before{border-radius:50%}.Checkbox.round .Checkbox-main:after{background:var(--color-primary) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=) no-repeat 50% 50%;background-size:12px;border-radius:50%}.Checkbox.loading .Checkbox-main:after,.Checkbox.loading .Checkbox-main:before{opacity:0!important}.Checkbox.loading .Spinner{position:absolute;left:.375rem;top:.125rem;opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Checkbox.blocking input:not(:checked)~.Checkbox-main:before{border-color:var(--color-error)}.Checkbox.blocking input:not(:checked)~.Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZmlsbD0iI2U1MzkzNSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTggM2EzIDMgMCAwMTMgM3YxMmEzIDMgMCAwMS0zIDNINmEzIDMgMCAwMS0zLTNWNmEzIDMgMCAwMTMtM2gxMnptLTIgOEg4YTEgMSAwIDAwMCAyaDhhMSAxIDAgMDAwLTJ6Ii8+PC9nPjwvc3ZnPg==);opacity:1;background-size:1.375rem;background-position:-.125rem -.125rem}.Checkbox input{position:absolute;z-index:var(--z-below);opacity:0}.Checkbox .Checkbox-main:after,.Checkbox .Checkbox-main:before{content:"";display:block;position:absolute;left:1.1875rem;top:.1875rem;width:1.125rem;height:1.125rem}.Checkbox .Checkbox-main:before{border:2px solid var(--color-borders);border-radius:.25rem;background-color:var(--color-white);transition:border-color .1s ease}.Checkbox .Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTE2LjcgMEMxOC41IDAgMjAgMS41IDIwIDMuM3YxMy4zYzAgMS44LTEuNSAzLjMtMy4zIDMuM0gzLjNDMS41IDIwIDAgMTguNSAwIDE2LjdWMy4zQzAgMS41IDEuNSAwIDMuMyAwaDEzLjR6bS0uOCA0LjhsLTguMSA4LjEtMy43LTMuN2MtLjQtLjQtMS4xLS40LTEuNiAwLS40LjQtLjQgMS4xIDAgMS42TDcgMTUuMmMuNC40IDEuMS40IDEuNiAwbDguOS04LjljLjQtLjQuNC0xLjEgMC0xLjYtLjUtLjQtMS4yLS40LTEuNi4xeiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);background-size:contain;background-repeat:no-repeat;opacity:0;transition:opacity .1s ease}.Checkbox .Checkbox-main .label{display:block}.Checkbox .Checkbox-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Checkbox input:checked~.Checkbox-main:before{border-color:var(--color-primary)}.Checkbox input:checked~.Checkbox-main:after{opacity:1}.Loading{display:flex;height:100%;align-items:center;justify-content:center}.Loading .Spinner{--spinner-size:2.75rem}.Menu.fluid .bubble{min-width:13.5rem;width:auto}.Menu .backdrop{position:fixed;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;z-index:var(--z-menu-backdrop)}.Menu .bubble{overflow:hidden;display:block;list-style:none;padding:.5rem 0;margin:0;position:absolute;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);min-width:13.5rem;z-index:var(--z-menu-bubble);transform:scale(.2);transition:opacity .2s cubic-bezier(.2,0,.2,1),transform .2s cubic-bezier(.2,0,.2,1)!important;--offset-y:calc(100% + 0.5rem);--offset-x:0}.Menu .bubble.open{transform:scale(1)}.Menu .bubble.closing{transition:opacity .2s ease-in,transform .2s ease-in!important}body.animation-level-0 .Menu .bubble{transform:none!important;transition:opacity .15s!important}body.has-open-dialog .Menu .bubble{transition:none!important}.Menu .bubble.top{top:var(--offset-y)}.Menu .bubble.bottom{bottom:var(--offset-y)}.Menu .bubble.left{left:var(--offset-x)}.Menu .bubble.right{right:var(--offset-x)}.Menu .bubble.with-footer{padding-bottom:0}.Menu .footer{padding:.5rem 0;background:var(--color-chat-hover);color:var(--color-text-secondary);font-size:.8125rem;text-align:center}.DropdownMenu,.MenuItem{position:relative}.MenuItem{width:100%;background:none;border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);--ripple-color:rgba(0,0,0,0.08);cursor:pointer}.MenuItem:focus,.MenuItem:hover{background-color:var(--color-chat-hover);text-decoration:none;color:inherit}.MenuItem i{font-size:1.5rem;color:var(--color-text-secondary)}.MenuItem .menu-item-name,.MenuItem i{margin-right:2rem}.MenuItem .menu-item-name.capitalize{text-transform:capitalize}.MenuItem.disabled{opacity:.5!important;cursor:default!important}.MenuItem.destructive{color:var(--color-error)}.MenuItem.destructive i{color:inherit}.MenuItem:not(.has-ripple):not(.disabled):active{background-color:var(--color-item-active);transition:none!important}.MenuItem>.Switcher{margin-left:auto}.CountryCodeInput .input-group{cursor:pointer;z-index:var(--z-country-code-input-group)}.CountryCodeInput .input-group .Spinner{position:absolute;top:1rem;right:.75rem;opacity:.5;--spinner-size:1.5rem}.CountryCodeInput .input-group .css-icon-down{position:absolute;top:1.125rem;right:1rem;width:.75rem;height:.75rem;border:2px solid var(--color-text-secondary);border-top:0;border-left:0;transform:scaleY(1) rotate(45deg);transition:color .2s ease,transform .2s ease,top .2s ease}.CountryCodeInput .input-group .css-icon-down.open{border-color:var(--color-primary);transform:scaleY(-1) rotate(45deg);top:1.5rem}.CountryCodeInput .bubble{width:100%;max-height:23.5rem;overflow-y:auto;transform-origin:top center!important;transform:scale(.95)}.CountryCodeInput .bubble.open{transform:scaleY(1)}.CountryCodeInput .MenuItem button{display:flex;align-items:center}.CountryCodeInput .MenuItem.no-results button{justify-content:center;padding:.5rem 1rem}.CountryCodeInput .MenuItem.no-results button span{font-size:.875rem}.CountryCodeInput .country-flag{font-size:2rem;margin-right:2rem}.CountryCodeInput .country-flag .emoji{width:2rem;height:2rem;display:inline-block;vertical-align:4px;margin:-.5rem .125rem}.CountryCodeInput .country-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:1rem;text-align:left}.CountryCodeInput .country-code{margin-left:auto;opacity:.5}.auth-form{width:100%;max-width:25.5rem;margin:0 auto;padding:6rem 1rem 1rem;text-align:center}@media (min-width:600px) and (min-height:450px){.auth-form{padding:6.8rem 1.5rem 1.5rem}}.auth-form #logo,.auth-form .AvatarEditable label{display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width:600px) and (min-height:450px){.auth-form #logo,.auth-form .AvatarEditable label{width:10rem;height:10rem;margin-bottom:2.5rem}}.auth-form #logo{background-size:100%;background:url(telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg) 50% no-repeat}.auth-form h2{font-size:1.25rem;line-height:1}@media (min-width:600px){.auth-form h2{font-size:2rem;line-height:1.5}}.auth-form .note{font-size:.875rem;line-height:1.35;margin-bottom:2.5rem;color:var(--color-text-secondary)}@media (min-width:600px){.auth-form .note{font-size:1rem;margin-bottom:3rem}}#auth-code-form,#auth-password-form,#auth-phone-number-form,#auth-qr-form,#auth-registration-form{height:100%;overflow-y:auto}#auth-phone-number-form form{min-height:26.25rem}#auth-phone-number-form .Button{margin-top:2.75rem}#auth-phone-number-form .Button+.Button{margin-top:1rem}#auth-code-form h2,#auth-password-form h2,.auth-number-edit{display:flex;align-items:center;justify-content:center}.auth-number-edit{width:2.5rem;height:2.5rem;padding:.5rem;font-size:1.5rem;color:var(--color-text-secondary);opacity:.75;cursor:pointer}.auth-number-edit:focus,.auth-number-edit:hover{opacity:1}#auth-qr-form .qr-container{height:280px;opacity:1;transform:scale(1);transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .3s}#auth-qr-form .qr-container.pre-animate{opacity:.5;transform:scale(.8)}#auth-qr-form h3{margin:1.5rem 0 1rem}#auth-qr-form ol{list-style:none;counter-reset:item;padding:0 2rem}#auth-qr-form ol li{counter-increment:item;text-align:left;margin:.75rem 0;display:flex}#auth-qr-form ol li:before{content:counter(item);display:flex;justify-content:center;align-items:center;min-width:1.4rem;height:1.4rem;padding:0;margin:0 .75rem 0 0;background:var(--color-primary);border-radius:50%;font-size:smaller;color:#fff}#sign-in-password{word-break:normal!important}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.499af208fa04aa805317cf014d869692.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.6b69287db14836e8ccee577d6457b127.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.350ec982325895563ada47d14c7936da.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.af30acd9d70ade5b828db02d25348da2.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.62afd8a72052ca925aafb4006fddff88.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.009379f5feecd3ef689ad46e029b31e6.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4mxKKTU1Kg.465390c6e54c60f4a15ff698f372e858.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.66efaee062df58309edc4cdfaef3f094.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.3e1bb90afe5eb4a94c5ffdb911fd21d0.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.acd64c8bf32762464b8f2c0600dc2b89.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.cab892ae9aa422233ea43db289e0c038.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.01bafbfbc1e4ebe0139d259614d5c12d.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.d3c211af53a789d2f9fd79599baca39a.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.324b1e6d0f5ae7c6ab42fed5516c7b3d.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:500}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:theme-color("primary");text-decoration:none;background-color:initial;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}:root{--color-background:#fff;--color-background-selected:#f4f4f5;--color-background-own:#eefedf;--color-background-own-selected:#d4fcae;--color-background-own-rgb:238,254,223;--color-text:#000;--color-text-lighter:#2e3939;--color-text-secondary:#707579;--color-text-secondary-rgb:112,117,121;--color-text-meta:#686c72;--color-text-meta-rgb:104,108,114;--color-text-meta-colored:#4fae4e;--color-text-green:#4fae4e;--color-text-green-rgb:79,174,78;--color-borders:#dadce0;--color-borders-input:#dadce0;--color-webpage-initial-background:#2e3939;--color-interactive-active:var(--color-primary);--color-interactive-inactive:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-buffered:rgba(var(--color-text-secondary-rgb),0.25);--color-primary:#50a2e9;--color-primary-rgb:80,162,233;--color-primary-shade:#4a95d6;--color-primary-shade-darker:#4388c4;--color-primary-shade-rgb:74,149,214;--color-primary-opacity:rgba(var(--color-primary),0.50);--color-green:#4dcd5e;--color-green-darker:#41ac4f;--color-error:#e53935;--color-error-shade:#d33431;--color-error-rgb:229,57,53;--color-warning:#fb8c00;--color-yellow:#fdd764;--color-links:#52a1ef;--color-links-hover:#2d8dec;--color-links-darker:#157be0;--color-links-darker-hover:#1166ba;--color-own-links:#fff;--color-placeholders:#a2acb4;--color-pinned:#fff;--color-code:#4a729a;--color-code-bg:rgba(112,117,121,0.08);--color-code-own:#3c7940;--color-code-own-bg:rgba(112,117,121,0.08);--color-accent-own:#4fae4e;--color-message-meta-own:#4fae4e;--color-reply-hover:#f4f4f4;--color-reply-active:#e8e9ea;--color-reply-own-hover:#dbf4ce;--color-reply-own-active:#c8ebbc;--color-white:#fff;--color-gray:#c4c9cc;--color-chat-hover:#f4f4f5;--color-chat-active:#5b90e0;--color-item-active:#ededed;--color-selection-highlight:#3993fb;--color-selection-highlight-emoji:rgba(57,147,251,0.7);--color-user-1:#e17076;--color-user-2:#7bc862;--color-user-4:#65aadd;--color-user-5:#a695e7;--color-user-6:#ee7aae;--color-user-7:#6ec9cb;--color-user-8:#faa774;--color-default-shadow:hsla(0,0%,44.7%,0.25);--color-light-shadow:hsla(0,0%,44.7%,0.17);--border-radius-default:0.75rem;--border-radius-default-small:0.625rem;--border-radius-default-tiny:0.375rem;--border-radius-messages:0.75rem;--border-radius-messages-small:0.375rem;--messages-container-width:45.5rem;--right-column-width:26.5rem;--header-height:3.625rem;--symbol-menu-width:26.25rem;--symbol-menu-height:23.25rem;--symbol-menu-footer-height:3rem;--z-ui-loader-mask:2000;--z-right-column:900;--z-header-menu:990;--z-header-menu-backdrop:980;--z-modal:1000;--z-media-viewer:1500;--z-drop-area:55;--z-notification:50;--z-animation-fade:50;--z-menu-bubble:21;--z-menu-backdrop:20;--z-message-highlighted:13;--z-message-context-menu:12;--z-mobile-search:11;--z-middle-header:10;--z-middle-footer:10;--z-country-code-input-group:10;--z-message-select-control:9;--z-message-select-area:8;--z-sticky-date:9;--z-register-add-avatar:5;--z-media-viewer-head:3;--z-below:-1;--spinner-white-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);--spinner-white-thin-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxVjBDNS40IDAgMCA1LjQgMCAxMnM1LjQgMTIgMTIgMTIgMTItNS40IDEyLTEyaC0xYzAgNi4xLTQuOSAxMS0xMSAxMXoiLz48L3N2Zz4=);--spinner-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);--spinner-dark-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzgzNzhEQiIvPjwvc3ZnPg==);--spinner-black-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzJlMzkzOSIvPjwvc3ZnPg==);--spinner-green-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRmYWU0ZSIvPjwvc3ZnPg==);--spinner-gray-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzcwNzU3OSIvPjwvc3ZnPg==);--drag-target-border:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--drag-target-border-hovered:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--layer-transition:300ms cubic-bezier(0.33,1,0.68,1);--layer-blackout-opacity:0.3;--slide-transition:450ms cubic-bezier(0.25,1,0.5,1);--select-transition:200ms ease-out;--vh:1vh}@media (min-width:1276px) and (max-width:1680px){:root{--right-column-width:25vw}}@media (max-width:600px){:root{--right-column-width:100vw;--header-height:3.5rem;--symbol-menu-width:100vw;--symbol-menu-height:14.6875rem;--layer-transition:450ms cubic-bezier(0.25,1,0.5,1)}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:2rem!important}.mt-5,.my-5{margin-top:2rem!important}.mr-5,.mx-5{margin-right:2rem!important}.mb-5,.my-5{margin-bottom:2rem!important}.ml-5,.mx-5{margin-left:2rem!important}.m-6{margin:3rem!important}.mt-6,.my-6{margin-top:3rem!important}.mr-6,.mx-6{margin-right:3rem!important}.mb-6,.my-6{margin-bottom:3rem!important}.ml-6,.mx-6{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:2rem!important}.pt-5,.py-5{padding-top:2rem!important}.pr-5,.px-5{padding-right:2rem!important}.pb-5,.py-5{padding-bottom:2rem!important}.pl-5,.px-5{padding-left:2rem!important}.p-6{padding:3rem!important}.pt-6,.py-6{padding-top:3rem!important}.pr-6,.px-6{padding-right:3rem!important}.pb-6,.py-6{padding-bottom:3rem!important}.pl-6,.px-6{padding-left:3rem!important}.input-group{position:relative;margin-bottom:1.5rem}.input-group label{display:block;padding:0 .25rem;position:absolute;left:.75rem;top:.95rem;background-color:var(--color-background);font-size:1rem;font-weight:400;color:var(--color-placeholders);transition:transform .15s ease-out,color .15s ease-out;cursor:text;pointer-events:none;transform-origin:left center;white-space:nowrap}.input-group.with-arrow:after{content:"";position:absolute;height:.75rem;width:.75rem;border-left:1px solid var(--color-text-secondary);border-bottom:1px solid var(--color-text-secondary);transform:rotate(-45deg);right:2rem;top:1rem}.input-group.error label,.input-group .form-control.focus+label,.input-group .form-control:focus+label,.input-group.success label,.input-group.touched label{transform:scale(.75) translate(-.5rem,-2.25rem)}.input-group .form-control::placeholder,.input-group input::placeholder{color:var(--color-placeholders)}.input-group.touched label{color:var(--color-text-secondary)}.input-group.error label{color:var(--color-error)!important}.input-group.success label{color:var(--color-text-green)!important}.input-group.disabled{opacity:.5;pointer-events:none}.form-control{--border-width:1px;display:block;width:100%;height:3.375rem;padding:calc(.75rem - var(--border-width)) calc(.9rem - var(--border-width));border:var(--border-width) solid var(--color-borders-input);border-radius:var(--border-radius-default);color:var(--color-text);background-color:var(--color-background);outline:none;transition:border-color .15s ease;word-break:break-word;-webkit-appearance:none;font-size:1rem;line-height:1.25rem}.form-control:hover{border-color:var(--color-primary)}.form-control:hover+label{color:var(--color-primary)}.form-control.focus,.form-control:focus{border-color:var(--color-primary);box-shadow:inset 0 0 0 1px var(--color-primary);caret-color:var(--color-primary)}.form-control.focus+label,.form-control:focus+label{color:var(--color-primary)}.form-control:disabled{background:none!important}.error .form-control{border-color:var(--color-error);box-shadow:inset 0 0 0 1px var(--color-error);caret-color:var(--color-error)}.success .form-control{border-color:var(--color-text-green);box-shadow:inset 0 0 0 1px var(--color-text-green);caret-color:var(--color-text-green)}select.form-control option{line-height:2rem}textarea.form-control{resize:none;overflow:hidden;line-height:1.3125rem;padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width))}.input-group.password-input{position:relative}.input-group.password-input .form-control{padding-right:3.375rem}.input-group.password-input .toggle-password{position:absolute;top:0;right:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none!important;color:var(--color-text-secondary);opacity:.7;font-size:1.5rem}.input-group.password-input .toggle-password:focus,.input-group.password-input .toggle-password:hover{opacity:1}@font-face{font-family:icomoon;src:url(icomoon.614a8c7d9a61b2762170dd8c484f6cbf.woff2) format("woff2"),url(icomoon.a3173a76102021a87cab628b6b1e6167.woff) format("woff");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bug:before{content:"\e97e"}.icon-data:before{content:"\e97d"}.icon-darkmode:before{content:"\e979"}.icon-animations:before{content:"\e97a"}.icon-enter:before{content:"\e97b"}.icon-fontsize:before{content:"\e97c"}.icon-permissions:before{content:"\e976"}.icon-card:before{content:"\e977"}.icon-truck:before{content:"\e978"}.icon-share-filled:before{content:"\e95a"}.icon-bold:before{content:"\e961"}.icon-bot-command:before{content:"\e962"}.icon-calendar-filter:before{content:"\e963"}.icon-comments:before{content:"\e964"}.icon-comments-sticker:before{content:"\e965"}.icon-arrow-down:before{content:"\e966"}.icon-email:before{content:"\e967"}.icon-italic:before{content:"\e968"}.icon-link:before{content:"\e969"}.icon-mention:before{content:"\e96a"}.icon-monospace:before{content:"\e96b"}.icon-next:before{content:"\e96c"}.icon-password-off:before{content:"\e96d"}.icon-pin-list:before{content:"\e96e"}.icon-previous:before{content:"\e96f"}.icon-replace:before{content:"\e970"}.icon-schedule:before{content:"\e971"}.icon-strikethrough:before{content:"\e972"}.icon-underlined:before{content:"\e973"}.icon-zoom-in:before{content:"\e974"}.icon-zoom-out:before{content:"\e975"}.icon-select:before{content:"\e960"}.icon-folder:before{content:"\e913"}.icon-bots:before{content:"\e915"}.icon-calendar:before{content:"\e916"}.icon-cloud-download:before{content:"\e917"}.icon-colorize:before{content:"\e918"}.icon-forward:before{content:"\e927"}.icon-reply:before{content:"\e947"}.icon-help:before{content:"\e92a"}.icon-info:before{content:"\e92b"}.icon-info-filled:before{content:"\e91b"}.icon-delete-filled:before{content:"\e91c"}.icon-delete:before{content:"\e91d"}.icon-edit:before{content:"\e923"}.icon-new-chat-filled:before{content:"\e939"}.icon-send:before{content:"\e94a"}.icon-send-outline:before{content:"\e94b"}.icon-add-user-filled:before{content:"\e904"}.icon-add-user:before{content:"\e905"}.icon-delete-user:before{content:"\e91e"}.icon-microphone:before{content:"\e935"}.icon-microphone-alt:before{content:"\e93b"}.icon-poll:before{content:"\e938"}.icon-revote:before{content:"\e93a"}.icon-photo:before{content:"\e940"}.icon-document:before{content:"\e91f"}.icon-camera:before{content:"\e90e"}.icon-camera-add:before{content:"\e90f"}.icon-logout:before{content:"\e932"}.icon-saved-messages:before{content:"\e948"}.icon-settings:before{content:"\e94e"}.icon-phone:before{content:"\e93f"}.icon-attach:before{content:"\e909"}.icon-copy:before{content:"\e91a"}.icon-channel:before{content:"\e911"}.icon-group:before{content:"\e929"}.icon-user:before{content:"\e959"}.icon-non-contacts:before{content:"\e928"}.icon-active-sessions:before{content:"\e902"}.icon-admin:before{content:"\e906"}.icon-download:before{content:"\e921"}.icon-location:before{content:"\e930"}.icon-stop:before{content:"\e952"}.icon-archive:before{content:"\e908"}.icon-unarchive:before{content:"\e953"}.icon-readchats:before{content:"\e933"}.icon-unread:before{content:"\e957"}.icon-message:before{content:"\e934"}.icon-lock:before{content:"\e931"}.icon-unlock:before{content:"\e954"}.icon-mute:before{content:"\e937"}.icon-unmute:before{content:"\e955"}.icon-pin:before{content:"\e941"}.icon-unpin:before{content:"\e956"}.icon-smallscreen:before{content:"\e95e"}.icon-fullscreen:before{content:"\e95f"}.icon-large-pause:before{content:"\e92e"}.icon-large-play:before{content:"\e92f"}.icon-pause:before{content:"\e93d"}.icon-play:before{content:"\e943"}.icon-channelviews:before{content:"\e912"}.icon-message-succeeded:before{content:"\e900"}.icon-message-read:before{content:"\e901"}.icon-message-pending:before{content:"\e94c"}.icon-message-failed:before{content:"\e94d"}.icon-favorite:before{content:"\e93e"}.icon-keyboard:before{content:"\e944"}.icon-delete-left:before{content:"\e945"}.icon-recent:before{content:"\e946"}.icon-gifs:before{content:"\e94f"}.icon-stickers:before{content:"\e95b"}.icon-smile:before{content:"\e950"}.icon-animals:before{content:"\e907"}.icon-eats:before{content:"\e922"}.icon-sport:before{content:"\e951"}.icon-car:before{content:"\e910"}.icon-lamp:before{content:"\e92c"}.icon-language:before{content:"\e92d"}.icon-flag:before{content:"\e926"}.icon-more:before{content:"\e936"}.icon-search:before{content:"\e949"}.icon-remove:before{content:"\e95c"}.icon-add:before{content:"\e903"}.icon-check:before{content:"\e914"}.icon-close:before{content:"\e919"}.icon-arrow-left:before{content:"\e90d"}.icon-arrow-right:before{content:"\e93c"}.icon-down:before{content:"\e920"}.icon-up:before{content:"\e958"}.icon-eye-closed:before{content:"\e925"}.icon-eye:before{content:"\e924"}.icon-muted-chat:before{content:"\e95d"}.icon-avatar-archived-chats:before{content:"\e90a"}.icon-avatar-deleted-account:before{content:"\e90b"}.icon-avatar-saved-messages:before{content:"\e90c"}.icon-pinned-chat:before{content:"\e942"}.media-inner{position:relative}.media-inner img,.media-inner video{display:block;object-fit:cover}.media-inner video{background:no-repeat 50% 50%;background-size:contain}.media-inner .media-loading,.media-inner .thumbnail~.full-media{position:absolute}.media-inner .thumbnail.empty{visibility:hidden}.animated-close-icon{position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform var(--slide-transition)}.animated-close-icon:after,.animated-close-icon:before{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}.animated-close-icon.no-transition,.animated-close-icon.no-transition:after,.animated-close-icon.no-transition:before{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.chat-list{height:100%;overflow-y:auto;padding:.5rem .125rem .5rem .4375rem}.chat-list .scroll-container{position:relative}.chat-list .ListItem.chat-item-clickable{margin:0}@media (max-width:600px){.chat-list{padding-left:0;padding-right:0}}.chat-list .no-results{color:var(--color-text-meta);margin-top:2rem;text-align:center}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeSpeed}body,html{width:100%;height:100%;background:var(--color-background);margin:0;padding:0;font-size:16px;font-family:Roboto,Helvetica Neue,Apple Color Emoji,sans-serif;color:var(--color-text);overflow:hidden}@media (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}body.cursor-grabbing,body.cursor-grabbing *{cursor:grabbing!important}#root{height:100%;max-width:1680px;margin:0 auto}@media (max-width:600px){#root{height:calc(var(--vh, 1vh)*100)}}#middle-column-portals,#portals{position:absolute;top:0;left:0;right:0}.hidden{visibility:hidden}.no-selection{user-select:none;-webkit-user-select:none!important}.visually-hidden{position:absolute!important;width:0;height:0;overflow:hidden;clip:rect(0,0,0,0);z-index:-1}.not-implemented{opacity:.5}.not-implemented,.not-implemented *{cursor:not-allowed!important}*{box-sizing:border-box}.disable-animations #root *{transition:none!important}.custom-scroll,.custom-scroll-x{scrollbar-width:thin;scrollbar-color:rgba(90,90,90,0) transparent;transition:scrollbar-color .3s ease;-webkit-overflow-scrolling:touch;pointer-events:auto}.custom-scroll-x::-webkit-scrollbar-thumb,.custom-scroll::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,0);border-radius:.35rem}.custom-scroll-x:focus,.custom-scroll-x:focus-within,.custom-scroll-x:hover,.custom-scroll:focus,.custom-scroll:focus-within,.custom-scroll:hover{scrollbar-color:rgba(90,90,90,.3) transparent}.custom-scroll-x:focus-within::-webkit-scrollbar-thumb,.custom-scroll-x:focus::-webkit-scrollbar-thumb,.custom-scroll-x:hover::-webkit-scrollbar-thumb,.custom-scroll:focus-within::-webkit-scrollbar-thumb,.custom-scroll:focus::-webkit-scrollbar-thumb,.custom-scroll:hover::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,.3)}.custom-scroll::-webkit-scrollbar{width:.375rem}.custom-scroll-x::-webkit-scrollbar{height:.35rem}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.emoji-small{background:no-repeat;background-size:1.25rem;color:transparent;display:inline-block;width:1.25rem;height:1.25rem;margin-right:1px;overflow:hidden}.emoji-small::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}div[role=button]{outline:none!important;cursor:pointer}.opacity-transition{opacity:1;transition:opacity .15s ease}.opacity-transition:not(.open){opacity:0}.opacity-transition:not(.shown){display:none}.opacity-transition.slow{transition-duration:.3s}.color-primary{color:var(--color-primary)!important}.color-danger{color:var(--color-error)!important}.text-muted{color:var(--color-text-secondary)!important}@keyframes grow-icon{0%{transform:scale(.5);opacity:.8}50%{transform:scale(1.1);opacity:1}to{transform:scale(1)}}@keyframes hide-icon{0%{transform:scale(1);opacity:.4}to{transform:scale(.5);opacity:0}} \ No newline at end of file diff --git a/dist/main.7a5c484269dea8524beb.js b/dist/main.3ac509d3ed06c3cff5da.js similarity index 56% rename from dist/main.7a5c484269dea8524beb.js rename to dist/main.3ac509d3ed06c3cff5da.js index cedcf71fa..9cfa372b8 100644 --- a/dist/main.7a5c484269dea8524beb.js +++ b/dist/main.3ac509d3ed06c3cff5da.js @@ -1,2 +1,2 @@ -!function(e){function t(t){for(var n,r,o=t[0],d=t[1],c=0,a=[];c=0&&I(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),O[n].renderTimes.push(t),O[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const o=w(u);return e.$element=y(e,[o]),e.$element}function j(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function E(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(E))}function S(e){return C(e),e.isMounted=!0,e.$element}function M(e){return m(e)?M(e.children[0]):e.target}function A(e,t){m(e)?A(e.children[0],t):e.target=t}function k(e){const{cursor:t,byCursor:n}=f.hooks.state;var r;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(r=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,r.scheduleNextState&&r.forceUpdate||(r.scheduleNextState=Object(u.h)(()=>function(e){e.isMounted&&e.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue})}(r)),r.forceUpdate=Object(u.i)(()=>function(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;C(e),e.$element!==t&&e.onUpdate()}(r))),r.scheduleNextState(),r.forceUpdate())})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function T(e,t,n){const{cursor:r,byCursor:u}=f.hooks.effects,o=f,d=()=>{if(!o.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(d):e(d),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return T(u.b,e,t)}function N(e,t){return T(u.d,e,t)}function D(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function F(e,t){return D(()=>e,t)}function L(e){return D(()=>({current:e}),[])}function x(e,t=d.a){return function(n){const r=L(n),u=L();return(!u.current||r.current&&!t(r.current,n))&&(r.current=n,u.current=g(e,n)),u.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(o.k)(Object.values(O),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"f",(function(){return r})),n.d(t,"o",(function(){return u})),n.d(t,"q",(function(){return o})),n.d(t,"D",(function(){return d})),n.d(t,"p",(function(){return c})),n.d(t,"C",(function(){return a})),n.d(t,"z",(function(){return i})),n.d(t,"A",(function(){return s})),n.d(t,"y",(function(){return f})),n.d(t,"B",(function(){return l})),n.d(t,"K",(function(){return b})),n.d(t,"L",(function(){return h})),n.d(t,"M",(function(){return m})),n.d(t,"N",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"E",(function(){return y})),n.d(t,"U",(function(){return I})),n.d(t,"Q",(function(){return w})),n.d(t,"R",(function(){return O})),n.d(t,"S",(function(){return C})),n.d(t,"h",(function(){return j})),n.d(t,"j",(function(){return E})),n.d(t,"i",(function(){return S})),n.d(t,"hb",(function(){return M})),n.d(t,"T",(function(){return A})),n.d(t,"x",(function(){return k})),n.d(t,"wb",(function(){return T})),n.d(t,"a",(function(){return P})),n.d(t,"e",(function(){return N})),n.d(t,"d",(function(){return D})),n.d(t,"r",(function(){return F})),n.d(t,"t",(function(){return L})),n.d(t,"u",(function(){return x})),n.d(t,"v",(function(){return B})),n.d(t,"eb",(function(){return R})),n.d(t,"db",(function(){return U})),n.d(t,"W",(function(){return _})),n.d(t,"V",(function(){return G})),n.d(t,"Z",(function(){return $})),n.d(t,"Y",(function(){return W})),n.d(t,"X",(function(){return H})),n.d(t,"H",(function(){return z})),n.d(t,"c",(function(){return K})),n.d(t,"ob",(function(){return V})),n.d(t,"pb",(function(){return q})),n.d(t,"jb",(function(){return J})),n.d(t,"kb",(function(){return Y})),n.d(t,"rb",(function(){return Q})),n.d(t,"nb",(function(){return Z})),n.d(t,"sb",(function(){return X})),n.d(t,"tb",(function(){return ee})),n.d(t,"qb",(function(){return te})),n.d(t,"ub",(function(){return ne})),n.d(t,"lb",(function(){return re})),n.d(t,"mb",(function(){return ue})),n.d(t,"O",(function(){return oe})),n.d(t,"P",(function(){return de})),n.d(t,"ib",(function(){return ce})),n.d(t,"G",(function(){return ae})),n.d(t,"k",(function(){return ie})),n.d(t,"ab",(function(){return se})),n.d(t,"cb",(function(){return fe})),n.d(t,"bb",(function(){return le})),n.d(t,"gb",(function(){return be})),n.d(t,"b",(function(){return he})),n.d(t,"g",(function(){return me})),n.d(t,"J",(function(){return pe})),n.d(t,"I",(function(){return ge})),n.d(t,"fb",(function(){return ye})),n.d(t,"F",(function(){return ve})),n.d(t,"vb",(function(){return Ie})),n.d(t,"w",(function(){return we})),n.d(t,"m",(function(){return Oe})),n.d(t,"n",(function(){return Ce})),n.d(t,"s",(function(){return je}));const r="Telegram WebZ alpha 8c99596",u=!1,o=!1,d=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",a="GramJs:sessionId",i=!1,s="tt-global-state",f=30,l=5e3,b=!1,h="tt-media",m="tt-media-avatars",p="tt-media-progressive",g="tt-custom-bg",y="tt-lang-packs",v=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),I=1,w=750,O=v?60:40,C=2*O,j=72,E=v?30:25,S=100,M=42,A=42,k=20,T=25,P=!1,N=2,D=N,F=16,L=1e4,x="editable-message-text",B="editable-message-text-modal",R=1440,U=1150,_=1275,G=925,$=600,W=950,H=450,z=1e9,K=100,V=13,q=11,J=160,Y=120,Q=64,Z=48,X=32,ee=64,te=64,ne=160,re=140,ue=80,oe="MEMOJI_STICKER",de=200,ce=450,ae=450,ie="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",se="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",fe=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,le=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,be=777e3,he=0,me=1,pe=10,ge=5,ye=2147483646,ve=["android","ios"],Ie="TelegramTips",we="https://bugs.telegram.org/?tag_ids=41&sort=time",Oe="#0F0F0F",Ce="#0a0a0a8c",je="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";n.d(t,"g",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"d",(function(){return I})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return O})),n.d(t,"f",(function(){return C})),n.d(t,"h",(function(){return j}));var r=n(0),u=n(1),o=n(29),d=n(22),c=n(9),a=n(25),i=n(3),s=n(21);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;const g=Object(c.i)((function(){h.forEach(e=>e(l))}));function y(e){"object"==typeof e&&e!==l&&(l=e,g())}function v(){return l}function I(){return m}function w(e,t){b[e]||(b[e]=[],m[e]=t=>{!function(e,t){b[e]&&b[e].forEach(e=>{const n=e(l,m,t);n&&y(n)})}(e,t)}),b[e].push(t)}function O(e){h.push(e)}function C(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function j(e=(()=>({})),t=(()=>({}))){return n=>function(u){const[c]=Object(r.r)(Object(d.a)(p)),i=Object(o.a)();Object(r.n)(()=>()=>{p.delete(c)},[c]);let b=p.get(c);if(b||(b={mapStateToProps:e,mapReducersToProps:t,ownProps:u,areMappedPropsChanged:!1,forceUpdate:i,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(c,b)),b.areMappedPropsChanged&&(b.areMappedPropsChanged=!1),!b.mappedProps||!Object(a.a)(b.ownProps,u)){b.ownProps=u;try{b.mappedProps={...e(l,u),...t(y,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},b.mappedProps,u))}}function E(e,t){const n=Object.keys(e);return n.length!==Object.keys(t).length?["LENGTH"]:n.filter(n=>e[n]!==t[n])}u.o&&(window.getGlobal=v,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function o(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function d(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function c(e,t){const n=new Set(t.map(String));return o(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,o]=Array.isArray(n)?n:[n,n],[d,c]=t;let a,i;if("function"==typeof d?(a=d(e)||0,i=d(r)||0):"string"==typeof d&&(a=e[d]||0,i=r[d]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof c?(t=c(e)||0,n=c(r)||0):"string"==typeof c&&(t=e[c]||0,n=r[c]||0),"asc"===o?t-n:n-t}}let u,o;return"function"==typeof t?(u=t(e)||0,o=t(r)||0):"string"==typeof t&&(u=e[t]||0,o=r[t]||0),"asc"===n?u-o:o-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return o})),n.d(t,"m",(function(){return d})),n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"Y",(function(){return r.c})),n.d(t,"Z",(function(){return r.d})),n.d(t,"ab",(function(){return r.e})),n.d(t,"xb",(function(){return r.h})),n.d(t,"pb",(function(){return r.f})),n.d(t,"wb",(function(){return r.g})),n.d(t,"W",(function(){return r.a})),n.d(t,"X",(function(){return r.b})),n.d(t,"lb",(function(){return u.w})),n.d(t,"kb",(function(){return u.v})),n.d(t,"ib",(function(){return u.t})),n.d(t,"nb",(function(){return u.y})),n.d(t,"jb",(function(){return u.u})),n.d(t,"ob",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"T",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"mb",(function(){return u.x})),n.d(t,"gb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"yb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"J",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"hb",(function(){return u.s})),n.d(t,"d",(function(){return u.b})),n.d(t,"Bb",(function(){return u.C})),n.d(t,"Ab",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"fb",(function(){return u.q})),n.d(t,"I",(function(){return u.n})),n.d(t,"A",(function(){return i})),n.d(t,"zb",(function(){return s})),n.d(t,"F",(function(){return f})),n.d(t,"M",(function(){return l})),n.d(t,"N",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"K",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"tb",(function(){return g})),n.d(t,"ub",(function(){return y})),n.d(t,"qb",(function(){return v})),n.d(t,"db",(function(){return I})),n.d(t,"vb",(function(){return w})),n.d(t,"eb",(function(){return O})),n.d(t,"U",(function(){return C})),n.d(t,"V",(function(){return j})),n.d(t,"sb",(function(){return E})),n.d(t,"rb",(function(){return S})),n.d(t,"v",(function(){return k})),n.d(t,"cb",(function(){return T})),n.d(t,"G",(function(){return P})),n.d(t,"O",(function(){return N})),n.d(t,"t",(function(){return D})),n.d(t,"u",(function(){return F})),n.d(t,"L",(function(){return L})),n.d(t,"y",(function(){return x})),n.d(t,"H",(function(){return B})),n.d(t,"z",(function(){return R})),n.d(t,"P",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"E",(function(){return G})),n.d(t,"D",(function(){return $})),n.d(t,"C",(function(){return H})),n.d(t,"B",(function(){return z})),n.d(t,"b",(function(){return V})),n.d(t,"i",(function(){return q})),n.d(t,"R",(function(){return J})),n.d(t,"S",(function(){return Y})),n.d(t,"bb",(function(){return Q})),n.d(t,"s",(function(){return Z})),n.d(t,"w",(function(){return X})),n.d(t,"r",(function(){return ee})),n.d(t,"a",(function(){return te}));var r=n(23),u=n(24),o=n(5),d=n(1),c=n(58);const a=new RegExp(d.ab,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t=!1){const{text:n,photo:r,video:u,audio:o,voice:d,document:c,sticker:a,contact:i,poll:s,invoice:f}=e.content;if(e.groupedId)return n?`${t?"":"🖼 "}${n.text}`:"Album";if(r)return n?`${t?"":"🖼 "}${n.text}`:"Photo";if(u)return u.isGif?n?`${t?"":"GIF "}${n.text}`:"GIF":n?`${t?"":"📹 "}${n.text}`:"Video";if(a)return"Sticker "+a.emoji;if(o){const e=[o.title,o.performer].filter(Boolean).join(" — ")||n&&n.text;return e?"🎧 "+e:"Audio"}return d?n?`${t?"":"🎤 "}${n.text}`:"Voice Message":c?`${t?"":"📎 "}${n?n.text:c.fileName}`:i?"Contact":s?"📊 "+s.summary.question:f?"Invoice":n?n.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||o||d||c||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||o||d||a||i||s||f)&&(Object(c.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function I(e){return!!e.content.action}function w(e){return e.chatId===d.gb&&E(e)}function O(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function C(e){return e.id>0?Object(r.d)(e):Object(u.i)(e)}function j(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function E(e){return e.id>=d.H}function S(e){return e.content.action&&"historyClear"===e.content.action.type}var M=n(7),A=n(53);function k(e){return e.content}function T(e){return Boolean(P(e)||N(e)||x(e)||L(e)||function(e){return e.content.contact}(e)||B(e)||D(e)||F(e)||function(e){return e.content.voice}(e))}function P(e){return e.content.photo}function N(e){return e.content.video}function D(e){return e.content.action}function F(e){return e.content.audio}function L(e){return e.content.sticker}function x(e){return e.content.document}function B(e){return e.content.poll}function R(e){return e.content.invoice}function U(e){return e.content.webPage}function _(e){const t=U(e);return t?t.photo:void 0}function G(e){const t=function(e){const t=P(e)||N(e)||x(e)||L(e)||_(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function $(e,t){const{photo:n,video:r,sticker:u,audio:o,voice:d,document:c}=e.content,a=_(e);if(!(n||r||u||a||o||d||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(K(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(K(e))return;return V(r)?W(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return W(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(A.c)(c)||K(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(o)switch(t){case"micro":case"pictogram":return;default:return W(o,s)}if(d)switch(t){case"micro":case"pictogram":return;default:return s}}function W(e,t){return M.h&&M.i?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function H(e,t){const{sticker:n,video:r,audio:u,voice:d}=e.content;return n&&"inline"===t&&n.isAnimated?o.ApiMediaFormat.Lottie:r&&M.h&&("viewerFull"===t||"inline"===t&&V(r))?o.ApiMediaFormat.Progressive:u||d?d&&!M.g?o.ApiMediaFormat.BlobUrl:o.ApiMediaFormat.Progressive:o.ApiMediaFormat.BlobUrl}function z(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function K(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function V(e){return e.isGif||e.isRound||e.size<=10485760}function q(e,t,n=!1){const r=X(e,t,"media");return n?r.reverse():r}function J(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Y(e)}function Y(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function Q(e){if(e.width&&e.height)return e}function Z(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function X(e,t,n){let r;switch(n){case"media":r=e=>{const t=N(e);return P(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=x;break;case"links":r=e=>U(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=F;break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function ee(e){const{audio:t,voice:n,video:r}=k(e),u=t||n||r;if(u)return u.duration}function te(e,t){return`${e}_${t}`}n(54)},function(e,t,n){"use strict";var r=n(59);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(60);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var o=n(61);n.d(t,"ApiMessageEntityTypes",(function(){return o.a})),n.d(t,"MAIN_THREAD_ID",(function(){return o.b})),n.d(t,"MESSAGE_DELETED",(function(){return o.c}));var d=n(62);n.o(d,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return d.ApiMediaFormat}));var c=n(63);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(64),n(65)},function(e,t,n){"use strict";n.d(t,"S",(function(){return Pe})),n.d(t,"kb",(function(){return Ne})),n.d(t,"V",(function(){return De})),n.d(t,"Db",(function(){return a})),n.d(t,"f",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"O",(function(){return f})),n.d(t,"N",(function(){return l})),n.d(t,"xb",(function(){return b})),n.d(t,"n",(function(){return h})),n.d(t,"g",(function(){return m})),n.d(t,"K",(function(){return p})),n.d(t,"d",(function(){return g})),n.d(t,"L",(function(){return y})),n.d(t,"j",(function(){return v})),n.d(t,"i",(function(){return I})),n.d(t,"M",(function(){return w})),n.d(t,"h",(function(){return O})),n.d(t,"q",(function(){return C})),n.d(t,"y",(function(){return T})),n.d(t,"r",(function(){return P})),n.d(t,"m",(function(){return N})),n.d(t,"nb",(function(){return D})),n.d(t,"X",(function(){return L})),n.d(t,"db",(function(){return x})),n.d(t,"x",(function(){return B})),n.d(t,"Eb",(function(){return R})),n.d(t,"gb",(function(){return U})),n.d(t,"lb",(function(){return _})),n.d(t,"ob",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"C",(function(){return W})),n.d(t,"E",(function(){return H})),n.d(t,"B",(function(){return z})),n.d(t,"bb",(function(){return K})),n.d(t,"zb",(function(){return V})),n.d(t,"F",(function(){return q})),n.d(t,"Ab",(function(){return J})),n.d(t,"Bb",(function(){return Y})),n.d(t,"yb",(function(){return Q})),n.d(t,"a",(function(){return Z})),n.d(t,"W",(function(){return X})),n.d(t,"k",(function(){return ee})),n.d(t,"mb",(function(){return te})),n.d(t,"D",(function(){return ne})),n.d(t,"l",(function(){return re})),n.d(t,"H",(function(){return ue})),n.d(t,"T",(function(){return oe})),n.d(t,"cb",(function(){return de})),n.d(t,"qb",(function(){return ce})),n.d(t,"J",(function(){return ae})),n.d(t,"b",(function(){return ie})),n.d(t,"e",(function(){return se})),n.d(t,"Cb",(function(){return fe})),n.d(t,"ib",(function(){return le})),n.d(t,"G",(function(){return be})),n.d(t,"Q",(function(){return he})),n.d(t,"p",(function(){return me})),n.d(t,"R",(function(){return pe})),n.d(t,"U",(function(){return ge})),n.d(t,"I",(function(){return ye})),n.d(t,"Z",(function(){return ve})),n.d(t,"P",(function(){return Ie})),n.d(t,"pb",(function(){return we})),n.d(t,"ab",(function(){return Oe})),n.d(t,"rb",(function(){return Ce})),n.d(t,"sb",(function(){return je})),n.d(t,"tb",(function(){return Ee})),n.d(t,"t",(function(){return Fe})),n.d(t,"A",(function(){return Se})),n.d(t,"w",(function(){return Me})),n.d(t,"v",(function(){return Ae})),n.d(t,"Y",(function(){return ke})),n.d(t,"u",(function(){return Te})),n.d(t,"z",(function(){return E})),n.d(t,"s",(function(){return S})),n.d(t,"ub",(function(){return M})),n.d(t,"vb",(function(){return A})),n.d(t,"c",(function(){return k})),n.d(t,"eb",(function(){return Le})),n.d(t,"fb",(function(){return xe})),n.d(t,"hb",(function(){return Be})),n.d(t,"wb",(function(){return Re}));var r=n(18),u=n(7),o=n(5),d=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e,t){return e.chats.byId[t]}function s(e,t){const n=Object(c.T)(t);return!!n&&a(e,n)}function f(e,t){return t===e.currentUserId}function l(e,t){const n=s(e,t);return n&&Object(c.wb)(n)}function b(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function h(e,t){if(Object(c.lb)(t.id)||Object(c.jb)(t))return;if(Object(c.nb)(t))return t.onlineCount;if(!t.fullInfo||!t.fullInfo.members)return;return t.fullInfo.members.map(e=>e.userId).reduce((t,n)=>e.users.byId[n]&&Object(c.xb)(e.users.byId[n])?t+1:t,0)}function m(e,t){const n=i(e,t),r=n&&Object(c.T)(n),u=r&&a(e,r);if(u&&Object(c.wb)(u))return u}function p(e,t){const n=i(e,t),r=m(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.rb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:d}=u.threadsById[o.MAIN_THREAD_ID]||{};return d&&!d.length}function g(e){return Boolean(e.chats.listIds.active)}function y(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function v(e,t){const n=i(e,t);if(n&&y(e,t))return n.folderId===d.g?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function w(e,t,n=d.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===d.b)return!!r&&r.includes(t);if(n===d.g)return!!u&&u.includes(t);const{byId:o}=e.chatFolders,{pinnedChatIds:c}=o[n]||{};return!!c&&c.includes(t)}function O(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function C(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((e,t)=>{const r=n[t];return r&&r.unreadCount&&!r.isMuted?e+r.unreadCount:e},0)}var j=n(3);function E(e){return e.stickers.search}function S(e){return e.gifs.search}function M(e,t){return e.stickers.setsById[t]}function A(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function k(e,t){const{animatedEmojis:n}=e;if(n&&n.stickers)return t=t.replace("️",""),n.stickers.find(e=>e.emoji===t)}function T(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function P(e){const{chatId:t}=T(e)||{};return t?i(e,t):void 0}function N(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function D(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function F(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const o=u.threadsById[n];return o?o[r]:void 0}function L(e,t,n){return F(e,t,n,"listedIds")}function x(e,t,n){return F(e,t,n,"outlyingIds")}function B(e,t,n,r){switch(r){case"thread":return R(e,t,n);case"pinned":return U(e,t);case"scheduled":return _(e,t)}}function R(e,t,n){return F(e,t,n,"viewportIds")}function U(e,t){return F(e,t,o.MAIN_THREAD_ID,"pinnedIds")}function _(e,t){return F(e,t,o.MAIN_THREAD_ID,"scheduledIds")}function G(e,t,n){return F(e,t,n,"scrollOffset")}function $(e,t,n){return F(e,t,n,"replyingToId")}function W(e,t,n){return F(e,t,n,"editingId")}function H(e,t){return F(e,t,o.MAIN_THREAD_ID,"editingScheduledId")}function z(e,t,n){return F(e,t,n,"draft")}function K(e,t,n){return F(e,t,n,"noWebPage")}function V(e,t,n){return F(e,t,n,"threadInfo")}function q(e,t,n){return F(e,t,n,"firstMessageId")}function J(e,t,n){if(n===o.MAIN_THREAD_ID)return i(e,t);const r=V(e,t,n);return r?i(e,r.originChannelId||t):void 0}function Y(e,t,n){if(n===o.MAIN_THREAD_ID)return;const r=V(e,t,n);return r?r.topMessageId:void 0}function Q(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:o}=n;return u||o?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||o&&o===e.threadInfo.topMessageId)):void 0}function Z(e,t,n){const r=T(e);if(!r)return!1;const{threadInfo:u}=Q(e,t,n)||{};return t===r.chatId&&(r.threadId===o.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function X(e,t,n){const r=R(e,t,n);if(!r||!r.length)return!0;let u;if(n===o.MAIN_THREAD_ID){const n=i(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=V(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=d.H&&!ee(e,t,u)||r[r.length-1]>=u}function ee(e,t,n){const r=N(e,t);return r?r[n]:void 0}function te(e,t,n){const r=D(e,t);return r?r[n]:void 0}function ne(e,t,n,r){if("scheduled"===r){const n=H(e,t);return n?te(e,t,n):void 0}{const r=W(e,t,n);return r?ee(e,t,r):void 0}}function re(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ue(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function oe(e,t){const n=ue(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function de(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=i(e,t.chatId)||{};return Object(c.sb)(t)||!n||n0?a(e,n):i(e,n)}function ae(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?i(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function ie(e,t,n){const r=i(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.lb)(r.id),o=f(e,t.chatId),d=Object(c.ib)(r),a=Object(c.nb)(r),s=Object(c.jb)(r),l=Object(c.vb)(t),b=Object(c.tb)(t),h=Object(c.db)(t),{content:m}=t,p=(o||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.qb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!l,y=u||r.isCreator||!s&&!Object(c.yb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,I=!1;const w=U(e,r.id);v&&(I=Boolean(w&&w.includes(t.id)),v=!I);const O=u||b||d||r.isCreator||Object(c.q)(r,"deleteMessages"),C=O&&!l&&(u&&!o||d&&(b||Object(c.q)(r,"deleteMessages"))),j=!h&&p&&(b||s&&(r.isCreator||Object(c.q)(r,"editMessages"))),E=!h&&!l,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,T=!h,P=!h&&(s||a),N=!h;return{noOptions:[g,j,v,I,O,C,E,A,k,T,P,N].every(e=>!e),canReply:g,canEdit:j,canPin:v,canUnpin:I,canDelete:O,canDeleteForAll:C,canForward:E,canFaveSticker:A,canUnfaveSticker:k,canCopy:T,canCopyLink:P,canSelect:N}}function se(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=T(e)||{},u=n&&N(e,n);if(!u||!t||!r)return{};const o=t.map(t=>u[t]&&ie(e,u[t],r)).filter(Boolean);return{canDelete:o.every(e=>e.canDelete),canDeleteForAll:o.every(e=>e.canDeleteForAll)}}function fe(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function le(e,t,n){if(n===o.MAIN_THREAD_ID){const n=i(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.sb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=V(e,t,n);if(!r)return;return r.lastReadInboxMessageId?r.lastMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId):r.lastReadInboxMessageId:r.topMessageId}}function be(e,t,n){if(n===o.MAIN_THREAD_ID){if(!i(e,t))return}else{const r=V(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const r=x(e,t,n),u=L(e,t,n),d=N(e,t);if(!d||!r&&!u)return;const c=le(e,t,n);if(r){const e=r.find(e=>!c||e>c&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled));if(e)return e}if(u){const e=u.find(e=>!c||e>c&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled));if(e)return e}}function he(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function me(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.ob)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=i(e,Number(n));return u&&Object(c.ob)(u)&&r[u.id].byId[t]}))}function pe(e){const{selectedMessages:t}=e;return Boolean(t)}function ge(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function ye(e,t,n){const r=N(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function ve(e,t,n){const r=N(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Ie(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=ve(e,t,n);return u&&u.every(e=>r.includes(e))}function we(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Oe(e,t){const n=i(e,t);if(!n)return;if(!l(e,n))return;const r=N(e,t),u=R(e,t,o.MAIN_THREAD_ID);if(!r||!u)return;const d=Object(j.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(j.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return d&&c&&c>d?void 0:d?r[d]:void 0}function Ce(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:o,shouldAutoDownloadMediaInGroups:d,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(o&&Object(c.lb)(n.id)||d&&Object(c.kb)(n)||a&&Object(c.jb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function je(e,t){const n=Object(c.O)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,o=n.isGif||n.isRound;return r&&!o||u&&o}function Ee(e){return e.settings.byKey.shouldLoopStickers}function Se(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;const r=Object(c.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Me(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=T(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ae(e){const t=Me(e);if(t)return e.localMediaSearch.byChatId[t]}function ke(e,t){return e.management.byChatId[t]}function Te(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;if(Object(c.lb)(t))return"user";const r=i(e,t);return r?Object(c.kb)(r)?"group":"channel":void 0}function Pe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Ne(e){const{users:t,isChatInfoShown:n,isStatisticsShown:o}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),c=Boolean(!u.f&&Se(e)),a=function(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),i=void 0!==E(e).query,s=void 0!==S(e).query,{chatId:f}=T(e)||{},l=t.selectedId,b=g(e),h=Boolean(l&&b),m=Boolean(f&&b)&&n;return d?r.l.PollResults:c?r.l.Search:a?r.l.Management:o?r.l.Statistics:i?r.l.StickerSearch:s?r.l.GifSearch:h?r.l.UserInfo:m?r.l.ChatInfo:void 0}function De(e){return void 0!==Ne(e)}function Fe(e){return e.globalSearch.query}function Le(e){return e.payment.messageId}function xe(e){return e.payment.formId}function Be(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function Re(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"n",(function(){return u})),n.d(t,"e",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"b",(function(){return c})),n.d(t,"i",(function(){return a})),n.d(t,"k",(function(){return i})),n.d(t,"f",(function(){return s})),n.d(t,"l",(function(){return f})),n.d(t,"c",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"h",(function(){return h})),n.d(t,"g",(function(){return m})),n.d(t,"a",(function(){return p})),n.d(t,"m",(function(){return g})),n.d(t,"o",(function(){return v}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),o="Mac OS"===u,d="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.Z||window.innerWidth<=r.Y&&window.innerHeight<=r.X,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(o||d)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p=window.devicePixelRatio||1,g=d;let y;function v(){return Boolean(y)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{y=e})},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...o)=>{u?(clearTimeout(u),u=void 0):n&&e(...o),u=self.setTimeout(()=>{r&&e(...o),u=void 0},t)}}function u(e,t,n=!0){let r,u,o;return(...d)=>{u=!0,o=d,r||(n&&(u=!1,e(...o)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...o)},t))}}function o(e){return a(h,e)}function d(e){return a(m,e)}function c(e){return a(i,e)}function a(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function i(e){Promise.resolve().then(e)}function s(e){self.requestIdleCallback?self.requestIdleCallback(e):i(e)}n.d(t,"a",(function(){return r})),n.d(t,"g",(function(){return u})),n.d(t,"i",(function(){return o})),n.d(t,"h",(function(){return d})),n.d(t,"j",(function(){return c})),n.d(t,"d",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"b",(function(){return h}));const f=e=>new Promise(t=>{setTimeout(()=>t(),e)});function l(){return new Promise(e=>{requestAnimationFrame(e)})}let b;function h(e,t=!1){b?t?b.unshift(e):b.push(e):(b=[e],requestAnimationFrame(()=>{const e=b;b=void 0,e.forEach(e=>e())}))}function m(e){return h(e,!0)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(70),u=n.n(r),o=n(1),d=n(22);let c;const a=new Map,i=new Map;function s(e,t=""){return c||(o.o&&console.log(">>> START LOAD WORKER"),c=new u.a,function(e){c.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(c)return b({type:"callMethod",name:e,args:t});o.o&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&c.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(d.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),c.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return y})),n.d(t,"c",(function(){return O})),n.d(t,"b",(function(){return C}));var r=n(1),u=n(13),o=n(10);var d=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(45);const b={en:c,es:a,it:i,pl:s,ru:f},h=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],m={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},p=new Map;let g;const{addCallback:y,removeCallback:v,runCallbacks:I}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let w;async function O(e,t){if(g&&e===w)return document.documentElement.lang=e,void(t&&t());const n=await async function(e){const t=await u.c(r.E,e,u.a.Json);if(t)return t;const n=await Object(o.a)("fetchLangPack",{sourceLangPacks:r.F,langCode:e});if(n)return await u.d(r.E,e,n.langPack),n.langPack;return}(e);if(n){if(b[e])try{const t=await fetch(b[e]),r=await t.json(),u=Object(d.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.o&&console.error(e)}p.clear(),w=e,g=n,document.documentElement.lang=e,t&&t(),I(g)}}function C(e,t,n){if(void 0!==t){const r=p.get(`${e}_${t}_${n}`);if(r)return r}if(!g)return e;const r=g[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=w&&m[w]?m[w](e):0;return h[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return p.set(`${e}_${t}_${n}`,r),r}return u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const o={},d={};async function c(e,t){if(!o[e]){switch(e){case u.Auth:o[u.Auth]=n.e(4).then(n.bind(null,92));break;case u.Main:r.o&&console.log(">>> START LOAD MAIN BUNDLE"),o[u.Main]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,91));break;case u.Extra:o[u.Extra]=Promise.all([n.e(0),n.e(2)]).then(n.bind(null,90))}o[e].then(f)}const c=await o[e];return d[e]||(d[e]=c),a(e,t)}function a(e,t){const n=d[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function o(e,t,n){if(!r)return;const o=new Request(t),d=await r.open(e),c=await d.match(o);if(c)switch(n){case u.Text:return c.text();case u.Blob:{const e=await c.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=c.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return c.json();default:return}}async function d(e,t,n){if(!r)return;const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),o=new Request(t),d=new Response(u);return(await r.open(e)).put(o,d)}function c(e){if(r)return r.delete(e)}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return c})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(9);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function o(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const o=new Uint8Array(u);for(;u--;)o[u]=r.charCodeAt(u);return new Blob([o],{type:n})}function d(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function c(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function o(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\u2624|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(20);n(86);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(12),o=n(29);t.a=(e,t,n=!1,d=!1)=>{const c=Object(u.c)(e,t),a=Object(o.a)();return d&&Object(u.b)(a),Object(r.n)(()=>{n||c||Object(u.d)(e,t).then(a)},[e,a,c,t,n]),c}},function(e,t,n){"use strict";let r,u,o,d,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersIncludedChats=28]="FoldersIncludedChats",e[e.FoldersExcludedChats=29]="FoldersExcludedChats",e[e.TwoFaDisabled=30]="TwoFaDisabled",e[e.TwoFaNewPassword=31]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=32]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=33]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=34]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=35]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=36]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=37]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=38]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=39]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=40]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=41]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=42]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=43]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=44]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=45]="TwoFaCongratulations"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(c||(c={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.Statistics=4]="Statistics",e[e.StickerSearch=5]="StickerSearch",e[e.GifSearch=6]="GifSearch",e[e.PollResults=7]="PollResults"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(p||(p={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"e",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return o}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var o="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function d(e){return o.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=o.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,o,d)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),o&&(a+=`${c}${o}`),d&&(a+=`${c}${d}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=c(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(78);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const o=Date.now();let d=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!d){if(Date.now()-o<=5e3){if(localStorage.getItem(r.A))localStorage.removeItem(r.A);else{if(!localStorage.getItem(r.C))return;localStorage.removeItem(r.C)}return d=!0,void window.location.reload()}0}}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"c",(function(){return c})),n.d(t,"d",(function(){return a})),n.d(t,"e",(function(){return i})),n.d(t,"h",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"g",(function(){return l})),n.d(t,"a",(function(){return b})),n.d(t,"b",(function(){return h}));var r=n(1),u=n(28),o=n(3);const d=[1,8,5,2,7,4,6];function c(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t){if(e.id===r.gb)return t("ServiceNotifications").toLowerCase();if(e.type&&"userTypeBot"===e.type)return"bot";if(!e.status)return"";switch(e.status.type){case"userStatusEmpty":return t("ALongTimeAgo");case"userStatusLastMonth":return t("WithinAMonth");case"userStatusLastWeek":return t("WithinAWeek");case"userStatusOffline":{const{wasOnline:n}=e.status;if(!n)return t("LastSeen.Offline");const r=new Date,o=new Date(1e3*n);if(o>=r)return t("LastSeen.JustNow");const d=new Date(r.getTime()-o.getTime());if(d.getTime()/1e3<60)return t("LastSeen.JustNow");if(d.getTime()/1e3<3600){return t("LastSeen.MinutesAgo",Math.floor(d.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),o>c){if(d.getTime()/1e3<21600){return t("LastSeen.HoursAgo",Math.floor(d.getTime()/1e3/60/60))}return t("LastSeen.TodayAt",Object(u.h)(o))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),o>a?t("LastSeen.YesterdayAt",Object(u.h)(o)):t("LastSeen.AtDate",Object(u.b)(o))}case"userStatusOnline":return t("Online");case"userStatusRecently":return t("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.gb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.gb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(o.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-n.indexOf(e);const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return d[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return a})),n.d(t,"v",(function(){return i})),n.d(t,"t",(function(){return s})),n.d(t,"y",(function(){return f})),n.d(t,"u",(function(){return l})),n.d(t,"z",(function(){return b})),n.d(t,"j",(function(){return h})),n.d(t,"p",(function(){return m})),n.d(t,"i",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"f",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"x",(function(){return I})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"A",(function(){return C})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return E})),n.d(t,"o",(function(){return S})),n.d(t,"h",(function(){return M})),n.d(t,"g",(function(){return A})),n.d(t,"s",(function(){return k})),n.d(t,"b",(function(){return T})),n.d(t,"C",(function(){return P})),n.d(t,"B",(function(){return N})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return L})),n.d(t,"n",(function(){return x}));var r=n(5),u=n(1),o=n(3),d=n(23),c=n(11);function a(e){return e>0}function i(e){return s(e)||f(e)}function s(e){return"chatTypeBasicGroup"===e.type}function f(e){return"chatTypeSuperGroup"===e.type}function l(e){return"chatTypeChannel"===e.type}function b(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function h(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function m(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function p(e,t){return t&&e.id===t.id&&t.isSelf?Object(c.b)("SavedMessages"):e.title||Object(c.b)("HiddenName")}function g(e){if(e.fullInfo)return e.fullInfo.about}function y(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function v(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function I(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function O(e,t){return!!e.adminRights&&e.adminRights[t]}function C(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!a(e.id)||(l(e)?O(e,"postMessages"):w(e)||!C(e,"sendMessages"))))}function E(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!C(e,"sendMedia"),canAttachPolls:(n||!C(e,"sendPolls"))&&(!a(e.id)||t),canSendStickers:n||!C(e,"sendStickers"),canSendGifs:n||!C(e,"sendGifs"),canAttachEmbedLinks:n||!C(e,"embedLinks")}}function S(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function M(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function A(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function k(e){return e.folderId===u.g}function T(e){return s(e)||(f(e)||l(e))&&e.isCreator}function P(e,t,n,r){const u=n.excludedChatIds?new Set(n.excludedChatIds):void 0,o=n.excludedChatIds?new Set(n.includedChatIds):void 0,d=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(r||Object.keys(e).map(Number)).filter(r=>function(e,t,n,r,u,o){if(r&&r.has(e.id))return!1;if(u&&u.has(e.id))return!0;if(o&&o.has(e.id))return!0;if(k(e)&&t.excludeArchived)return!1;if(e.isMuted&&t.excludeMuted)return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(a(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(i(e))return!!t.groups;if(l(e))return!!t.channels}return!1}(e[r],n,t,u,o,d)),n.pinnedChatIds]}function N(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(k(e))return!1;break;case"archived":if(!k(e))return!1}return!e.isRestricted&&!e.isNotJoined}const d=t.map(t=>e[t]).filter(u),c=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>c.has(e.id)):[],otherChats:Object(o.k)(n?d.filter(e=>!n.includes(e.id)):d,A,"desc")}}function D(e,t,n,r){const[u]=P(e,t,n,r),o=u.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:o.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:o.some(e=>e.unreadMentionsCount||!e.isMuted&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u){const{id:o,title:d,emoticon:c,description:a,pinnedChatIds:i,excludedChatIds:s,includedChatIds:f,excludeArchived:l,excludeMuted:b,excludeRead:h,...m}=n;if(Object.values(m).filter(Boolean).length>1||s&&s.length||f&&f.length){return u("Chats",function(e,t,n,r){const[u,o]=P(e,t,n,r),{pinnedChats:d,otherChats:c}=N(e,u,o,"folder");return d.length+c.length}(e,t,n,r))}return m.bots?u("FilterBots"):m.groups?u("FilterGroups"):m.channels?u("FilterChannels"):m.contacts?u("FilterContacts"):m.nonContacts?u("FilterNonContacts"):void 0}function L(e){return!!e&&e.id<0}function x(e,t){if(t&&!a(e))return t.isSelf?"You":Object(d.c)(t)}},function(e,t,n){"use strict";function r(e,t){const n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>e[n]===t[n])}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(1);const u=new Set(["scroll","mouseenter","mouseleave"]),o={},d=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){o[e]||(o[e]=new Map);return o[e]})(e).set(t,n),function(e){const t=d.get(e);if(t)return t;const n=new Set;return d.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),o[e].delete(t),d.get(t).delete(e)}function b(e){const t=d.get(e);t&&(t.forEach(t=>l(t,e)),d.delete(e))}function h(e){const t=o[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},o=()=>{e.preventDefault()},d=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?o:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(d),n))return;r=r.parentNode}}}r.o&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:o,delegatedEventsByElement:d,documentEventCounters:c})})},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=(e=!1,t,n=!1,o="fast",d=!1)=>{const[c,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(!1);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),c||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},d?0:350)));const l=s||e&&n,b=Boolean(i.current),h=e||b;return{shouldRender:h,transitionClassNames:Object(u.a)(o&&"opacity-transition",o,l&&"open",h&&"shown",b&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return a})),n.d(t,"k",(function(){return i})),n.d(t,"n",(function(){return s})),n.d(t,"h",(function(){return l})),n.d(t,"g",(function(){return b})),n.d(t,"b",(function(){return h})),n.d(t,"f",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"i",(function(){return I})),n.d(t,"a",(function(){return w})),n.d(t,"l",(function(){return C})),n.d(t,"m",(function(){return j}));var r=n(41),u=n(11);const o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],d=["January","February","March","April","May","June","July","August","September","October","November","December"],c=d.map(e=>e.toLowerCase());function a(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function i(e){return a(e).getTime()}function s(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function f(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function l(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function b(e){const t="number"==typeof e?new Date(e):e,n=a(new Date);if(t>=n)return l(t);const r=new Date(n);if(r.setDate(n.getDate()-7),t>=r)return Object(u.b)("Weekday.Short"+o[t.getDay()]);const d=t.getFullYear()!==n.getFullYear();return g(t,Object(u.b)(d?"formatDateScheduleYear":"formatDateSchedule")||(d?"d MMM yyyy":"d MMM"))}function h(e){return g("number"==typeof e?new Date(e):e,Object(u.b)("formatterYearMax")||"dd.MM.yyyy")}function m(e,t=!1){return g(e,Object(u.b)(t?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy")}function p(e,t=!1,n=!1){const r="number"==typeof e?new Date(e):e,d=a(new Date);if(!n){if(f(r)===f(d))return(t?E:S)(Object(u.b)("Weekday.Today"));const e=new Date(d);if(e.setDate(d.getDate()-1),f(r)===f(e))return(t?E:S)(Object(u.b)("Weekday.Yesterday"));const n=new Date(d),c=new Date(d);if(n.setDate(d.getDate()-7),c.setDate(d.getDate()+7),r>=n&&r<=c){const e=o[r.getDay()];return t?E(Object(u.b)("Weekday.Short"+e)):S(Object(u.b)("Weekday."+e))}}const c=r.getFullYear()!==d.getFullYear(),i=t?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate";return(t?E:S)(g(r,Object(u.b)(i)||"d MMMM yyyy"))}function g(e,t){const n=e.getDate(),r=e.getMonth();return t.replace("LLLL",Object(u.b)(d[r])).replace("MMMM",Object(u.b)("Month.Gen"+d[r])).replace("MMM",Object(u.b)("Month.Short"+d[r])).replace("MM",String(r+1).padStart(2,"0")).replace("dd",String(n).padStart(2,"0")).replace("d",String(n)).replace("yyyy",String(e.getFullYear()))}function y(e){const t="number"==typeof e?new Date(e):e;return`${p(t,!0)}, ${l(t)}`}function v(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function I(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const o=(e=Math.floor(e/60))%60;return o>0&&t.push(String(o).padStart(2,"0")),t.push(String(u).padStart(o>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function w(e){return e.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric"})}function O(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function C(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!O(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),o=t?u[0]:u[1],d=(t?u[1]:u[0]).toLowerCase(),a=c.findIndex(e=>e.startsWith(d));return-1!==a&&O(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function j(e){return e+r.j/1e3}function E(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function S(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#21212140"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code-own":["#3C7940","#FFFFFF"]}')},function(e,t,n){"use strict";var r=n(0),u=n(8),o=n(20),d=n(33);n(80);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:c,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:I,ariaLabel:w,href:O,download:C,disabled:j,ripple:E,faded:S,tabIndex:M})=>{let A=Object(r.q)(null);e&&(A=e);const[k,T]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",j&&"disabled",v&&"text",I&&"loading",E&&"has-ripple",S&&"faded",k&&"clicked"),N=Object(r.m)(e=>{!j&&n&&n(e),T(!0),setTimeout(()=>{T(!1)},400)},[j,n]),D=Object(r.m)(e=>{e.preventDefault(),!j&&a&&a(e)},[a,j]);return O?r.a.createElement("a",{ref:A,className:P,href:O,title:w,download:C,tabIndex:M},l,!j&&E&&r.a.createElement(d.a,null)):r.a.createElement("button",{ref:A,type:t,className:P,onClick:N,onContextMenu:c,onMouseDown:D,onMouseEnter:i&&!j?i:void 0,onMouseLeave:s&&!j?s:void 0,onFocus:f&&!j?f:void 0,"aria-label":w,title:w,tabIndex:M},I?r.a.createElement("div",null,r.a.createElement("span",null,"Please wait.."),r.a.createElement(o.a,{color:v?"blue":"white"})):l,!j&&E&&r.a.createElement(d.a,null))}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(83);t.a=e=>{const{icon:t,className:n,children:o,onClick:d,href:c,download:a,disabled:i,destructive:s,ariaLabel:f}=e,l=Object(r.m)(e=>{if(i||!d)return e.stopPropagation(),void e.preventDefault();d(e)},[i,d]),b=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return i||!d?(e.stopPropagation(),void e.preventDefault()):void d(e)},[i,d]),h=Object(u.a)("MenuItem",n,i&&"disabled",s&&"destructive"),m=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t}),o);return c?r.a.createElement("a",{tabIndex:0,className:h,href:c,download:a,"aria-label":f,title:f,target:"_blank",rel:"noopener noreferrer"},m):r.a.createElement("div",{role:"button",tabIndex:0,className:h,onClick:l,onKeyDown:b,"aria-label":f,title:f},m)}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(79);t.a=()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),o=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,o=u.getBoundingClientRect(),d=u.offsetWidth/2;t([...e,{x:r.clientX-o.x-d/2,y:r.clientY-o.y-d/2,size:d}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:o},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(73),u=n.n(r),o=n(7),d=n(14),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(o.o)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(d.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(d.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(15),o=n(1),d=n(7),c=n(67),a=n(8),i=n(68),s=n(51);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return o=e,d=n.highlight,o.reduce((e,t)=>{if("string"!=typeof t||!d)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(d.toLowerCase()),o=n[u+d.length];if(u<0||o&&o.match(f))return[...e,t];const c=[];return c.push(t.substring(0,u)),c.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+d.length))),c.push(t.substring(u+d.length)),[...e,...c]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=[...t.match(p)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let o=n.shift(),d=0;for(;o;){const e=t.indexOf(o,d);u.push(t.substring(d,e)),o.startsWith("@")?u.push(r.a.createElement(i.a,{username:o},o)):u.push(r.a.createElement(s.a,{text:o,url:o})),d=e+o.length,o=n.shift()}return u.push(t.substring(d)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var o,d;return e},[e])}function h(e,t,n){return d.c?e:e.reduce((e,o)=>{if("string"!=typeof o)return[...e,o];const d=o.split(u.a),i=o.match(u.a)||[];return e.push(d[0]),i.reduce((e,o,i)=>{const s=Object(c.a)(Object(u.b)(o)),f=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.a.createElement("img",{className:f,src:`./img-apple-${"big"===t?"160":"64"}/${s}.png`,alt:o})),"html"===n&&e.push(`${o}`);const l=2*i+2;return d[l]&&e.push(d[l]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,o)=>{const d=n.trimLeft(),c=n.length-d.length;return e.push(String.fromCharCode(160).repeat(c)+d),u!==o.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(o.ab,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),o=n.match(l)||[];return e.push(u[0]),o.reduce((e,n,o)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const d=2*o+2;return u[d]&&e.push(u[d]),e},e)},[])}},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"q",(function(){return o})),n.d(t,"G",(function(){return d})),n.d(t,"r",(function(){return c})),n.d(t,"F",(function(){return a})),n.d(t,"K",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"I",(function(){return f})),n.d(t,"H",(function(){return l})),n.d(t,"L",(function(){return m})),n.d(t,"v",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return I})),n.d(t,"J",(function(){return w})),n.d(t,"cb",(function(){return O})),n.d(t,"i",(function(){return C})),n.d(t,"j",(function(){return j})),n.d(t,"T",(function(){return E})),n.d(t,"bb",(function(){return S})),n.d(t,"f",(function(){return A})),n.d(t,"x",(function(){return k})),n.d(t,"ib",(function(){return T})),n.d(t,"jb",(function(){return P})),n.d(t,"t",(function(){return N})),n.d(t,"N",(function(){return D})),n.d(t,"M",(function(){return F})),n.d(t,"l",(function(){return L})),n.d(t,"E",(function(){return x})),n.d(t,"m",(function(){return B})),n.d(t,"gb",(function(){return R})),n.d(t,"fb",(function(){return U})),n.d(t,"O",(function(){return _})),n.d(t,"p",(function(){return G})),n.d(t,"hb",(function(){return $})),n.d(t,"n",(function(){return W})),n.d(t,"w",(function(){return z})),n.d(t,"lb",(function(){return K})),n.d(t,"mb",(function(){return V})),n.d(t,"e",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"k",(function(){return Y})),n.d(t,"P",(function(){return Z})),n.d(t,"Q",(function(){return X})),n.d(t,"S",(function(){return ee})),n.d(t,"R",(function(){return te})),n.d(t,"W",(function(){return ue})),n.d(t,"s",(function(){return oe})),n.d(t,"X",(function(){return de})),n.d(t,"V",(function(){return ae})),n.d(t,"U",(function(){return ie})),n.d(t,"Z",(function(){return fe})),n.d(t,"Y",(function(){return le})),n.d(t,"u",(function(){return be})),n.d(t,"ab",(function(){return he})),n.d(t,"a",(function(){return me})),n.d(t,"o",(function(){return pe})),n.d(t,"kb",(function(){return ge})),n.d(t,"eb",(function(){return ye})),n.d(t,"C",(function(){return ve})),n.d(t,"A",(function(){return Ie})),n.d(t,"y",(function(){return we})),n.d(t,"D",(function(){return Oe})),n.d(t,"z",(function(){return Ce})),n.d(t,"B",(function(){return je})),n.d(t,"g",(function(){return Ee})),n.d(t,"h",(function(){return Se}));var r=n(1),u=n(3);function o(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function d(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:o(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n){const{byId:r}=e.chats,o=r[t],d=n.isMin&&o&&!o.isMin,a={...o,...d?Object(u.j)(n,["isMin","accessHash"]):n};return a.id&&a.type?c(e,{...r,[t]:a}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.g?"archived":"active";let o=e.chats.listIds;return Object.keys(o).forEach(e=>{const n=o[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(o={...o,[e]:n.filter(e=>e!==t)}):o={...o,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:o}},t,{folderId:n||void 0})}function l(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=I(e,t,n[t])}),e}function I(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(h.m)(e,t)||{},o={...u[n],...r};return o.id?p(e,t,{...u,[n]:o}):e}function O(e,t,n,r){const u=Object(h.nb)(e,t)||{},o={...u[n],...r};return o.id?N(e,t,{...u,[n]:o},void 0):e}function C(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const o=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost),d=Object(u.j)(r,n);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{let u=Object(h.X)(e,t,r),o=Object(h.db)(e,t,r),d=Object(h.Eb)(e,t,r),c=Object(h.gb)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",o),e=y(e,t,r,"viewportIds",d),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:o,fromMessageId:d}=n.forwardInfo,c=Object(h.k)(e,o,d);r&&u===d&&(e=m(e,t)),c&&(e=w(e,o,d,{threadInfo:void 0}))})}return e=p(e,t,d)}function j(e,t,n){const r=Object(h.nb)(e,t);if(!r)return e;const o=Object(u.j)(r,n);let d=Object(h.lb)(e,t);return d&&(n.forEach(e=>{d.includes(e)&&(d=d.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",d)),e=N(e,t,o,void 0)}function E(e,t,n,r){const u=Object(h.X)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:y(e,t,n,"listedIds",M([...u||[],...o]))}function S(e,t,n,r){const u=Object(h.db)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:y(e,t,n,"outlyingIds",M([...u||[],...o]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const o=Object(h.Eb)(e,t,n)||[];if(o.includes(u))return e;return y(e,t,n,"viewportIds",M([...o.length{e=T(e,t.chatId,t.threadId,t)}),e}function N(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function F(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function L(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function x(e,t,n,r,o,d,c,a=!1){const{selectedMessages:i}=e;d&&(c=Object(h.Z)(e,t,d));const s=c||[o];if(!i)return L(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const d=Object(h.x)(e,t,n,r),c=d.indexOf(f[f.length-1]),a=d.indexOf(o),i=Math.min(c,a),s=Math.max(c,a),b=d.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:B(e)}function B(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,o){const d=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(d,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map(({id:e})=>e)}}}}}function U(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function _(e,t,n,r){const{results:u}=e.gifs.search;let o;if(t||!u)o=n;else{const e=new Set(u.map(e=>e.id));o=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:o}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const o=[...Object(h.vb)(e,t),...n||[]],d=Object(u.o)(o.map(({id:e})=>e)),c=Object(u.c)(o,"id"),a=d.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var H=n(44);function z(e,t){return{...e,users:{...e.users,byId:t}}}function K(e,t,n){const{byId:r}=e.users,{hash:o,userIds:d}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&d&&!d.includes(t)&&(e={...e,contactList:{hash:o||0,userIds:[t,...d]}}),z(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=K(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=K(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],z(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):H.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,o){const{resultsByType:d}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=d&&d[r]?d[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],isActive:r,query:u})}function oe(e,t,n,r,u,o){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],results:{foundIds:r,totalCount:u,nextOffsetId:o}})}function de(e,t,n,r,o,d){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return oe(e,t,n,Object(u.a)(i,s)?i:s,o,d)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,o,d){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,o){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:o}}})}(e,t,n,Object(u.a)(a,i)?a:i,o,d)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function me(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function pe(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ge(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function ye(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function ve(e,t){return{...e,payment:{...e.payment,formId:t}}}function Ie(e,t){return{...e,payment:{...e.payment,step:t}}}function we(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:o}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:o}}}}function Oe(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ce(e,t){return{...e,payment:{...e.payment,...t}}}function je(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:o,title:d}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:o,title:d}}}}function Ee(e){return{...e,payment:{}}}function Se(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=Object(r.h)(({ref:e,id:t,className:n,value:o,label:d,error:c,success:a,disabled:i,readOnly:s,placeholder:f,autoComplete:l,inputMode:b,maxLength:h,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v})=>{const I=c||a||d,w=Object(u.a)("input-group",o&&"touched",c?"error":a&&"success",i&&"disabled",s&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:w},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,value:o||"",placeholder:f,maxLength:h,autoComplete:l,inputMode:b,disabled:i,readOnly:s,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),o=n(20);n(85);t.a=Object(r.h)(({id:e,name:t,value:n,label:d,subLabel:c,checked:a,disabled:i,round:s,blocking:f,isLoading:l,onChange:b,onCheck:h})=>{const m=Object(r.m)(e=>{b&&b(e),h&&h(e.currentTarget.checked)},[b,h]),p=Object(u.a)("Checkbox",i&&"disabled",s&&"round",l&&"loading",f&&"blocking");return r.a.createElement("label",{className:p},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:a,disabled:i,onChange:m}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label"},d),c&&r.a.createElement("span",{className:"subLabel"},c)),l&&r.a.createElement(o.a,null))})},function(e,t,n){"use strict";n.d(t,"g",(function(){return r})),n.d(t,"f",(function(){return u})),n.d(t,"B",(function(){return o})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"v",(function(){return i})),n.d(t,"s",(function(){return s})),n.d(t,"t",(function(){return f})),n.d(t,"u",(function(){return l})),n.d(t,"q",(function(){return b})),n.d(t,"e",(function(){return h})),n.d(t,"b",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return g})),n.d(t,"E",(function(){return y})),n.d(t,"F",(function(){return v})),n.d(t,"G",(function(){return I})),n.d(t,"l",(function(){return w})),n.d(t,"n",(function(){return O})),n.d(t,"m",(function(){return C})),n.d(t,"k",(function(){return j})),n.d(t,"o",(function(){return E})),n.d(t,"J",(function(){return S})),n.d(t,"H",(function(){return M})),n.d(t,"I",(function(){return A})),n.d(t,"p",(function(){return k})),n.d(t,"C",(function(){return T})),n.d(t,"D",(function(){return P})),n.d(t,"j",(function(){return N})),n.d(t,"A",(function(){return D})),n.d(t,"z",(function(){return F})),n.d(t,"x",(function(){return L})),n.d(t,"y",(function(){return x})),n.d(t,"w",(function(){return B})),n.d(t,"a",(function(){return R}));const r=window.devicePixelRatio||1,u={begin:.8,end:1},o=300,d=500,c=10,a=320,i=15,s=2,f=.45,l=10,b=.5,h=20,m="300 10px Helvetica, Arial, sans-serif",p=45,g=50,y=30,v=1,I=.1,w=40,O=10,C=1,j=8,E=4,S=o,M=.1,A=.5,k=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],T=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],P=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],N=864e5,D=200,F=4,L=1e3,x=1,B=.5,R=["begin 200 fast","end 200 fast","labelFromIndex 200 fast floor","labelToIndex 200 fast ceil","xAxisScale 400","yMinViewport","yMaxViewport","yMinViewportSecond","yMaxViewportSecond","yMinMinimap","yMaxMinimap","yMinMinimapSecond","yMaxMinimapSecond","yAxisScale","yAxisScaleSecond"]},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(50);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var r=n(0);let u,o=!1;const d=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),o=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{o=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(o&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,e])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function o(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function d(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return d}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";var r=n(0),u=n(27),o=n(69),d=n(52),c=n(42),a=n(8),i=n(43);n(81);t.a=({ref:e,containerRef:t,isOpen:n,className:s,style:f,children:l,positionX:b="left",positionY:h="top",autoClose:m=!1,footer:p,noCloseOnBackdrop:g=!1,onCloseAnimationEnd:y,onClose:v,onMouseEnter:I,onMouseLeave:w})=>{let O=Object(r.q)(null);e&&(O=e);const C=t||O,{transitionClassNames:j}=Object(u.a)(n,y);Object(r.n)(()=>n&&v?Object(c.a)(v):void 0,[n,v]),Object(d.a)(([e])=>{void 0!==e&&Object(i.b)(200)},[n]);const E=((e,t,n)=>{const[u,o]=Object(r.r)(-1);Object(r.n)(()=>{o(-1)},[t]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n();if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,c=Array.from(r.children);let a=d&&c.indexOf(d)||u;if(38===t.keyCode&&a>0)a--;else if(40===t.keyCode&&a{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(34);const m={[r.ApiMediaFormat.DataUri]:d.a.Text,[r.ApiMediaFormat.BlobUrl]:d.a.Blob,[r.ApiMediaFormat.Lottie]:d.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.h?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.K){const n=e.startsWith("avatar")?u.M:u.L,r=await d.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.g||(t=await b(t)),"image/webp"===r.type&&!Object(a.o)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=w(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let d=!1;return r.addEventListener("sourceopen",()=>{if(d)return;d=!0;const u=r.addSourceBuffer("audio/mpeg");Object(o.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(o.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.g){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=w(t),f=e.type}if("image/webp"===f&&!Object(a.o)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=w(n),f=t.type)}return p.set(e,s),s}(e,t,n).catch(e=>{u.o&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function I(e){Object(o.b)(e)}function w(e){return e instanceof Blob?URL.createObjectURL(e):e}a.h&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const d=await Object(o.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!d)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=d;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(9);let u=o();function o(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}const d=Object(r.g)(()=>{u=o()},250,!0);window.addEventListener("resize",d),window.addEventListener("orientationchange",d),t.a={get:()=>u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onTab:[]};function o(e){return d()||document.addEventListener("keydown",c,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),d()||document.removeEventListener("keydown",c,!1)}(e)}}function d(){return Object.values(u).some(e=>Boolean(e.length))}function c(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";var r=n(0),u=n(2);const o=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function d(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function c(e,t){const n=[],r=[],u=e.length;let c,a,i,s,f,l,b,h,m,p,g,y,v;for(c=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(I=e.charCodeAt(b++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=d(i-h,a,0===h),Math.floor(i/a)>2147483647-c)throw RangeError("punycode_overflow(3)");c+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,c),i++}var I;if(t)for(i=0,v=n.length;iObject(s.l)(t,["openTelegramLink"]))(({url:e,text:t,className:n,children:u,openTelegramLink:o})=>{const d=Object(r.m)(t=>!(!(t.ctrlKey||t.altKey||t.shiftKey||t.metaKey)&&e&&(e.match(i.cb)||e.match(i.bb)))||(t.preventDefault(),o({url:e}),!1),[o,e]);if(!e)return;const c=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:c,onClick:d},u||t)}))},function(e,t,n){"use strict";var r=n(0),u=n(37);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return c}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return o(t,n)}function o(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function d(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function c(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:o,fieldError:d,description:c}=u?r[u]:r[n];return{field:o,fieldError:d,description:c||t}}const o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function d(e){return Object.values(e).reduce((e,t)=>{const n=o[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return d}));var r=n(9);let u;function o(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&o(e,t)})}function d(e){Object(r.b)(()=>{e()&&d(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(47);n(82);t.a=({trigger:e,className:t,children:n,positionX:o="left",positionY:d="top",footer:c})=>{const a=Object(r.q)(null),i=Object(r.q)(null),[s,f]=Object(r.r)(!1);return r.a.createElement("div",{ref:i,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=a.current;if(!s||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{f(!s)},isOpen:s}),r.a.createElement(u.a,{ref:a,containerRef:i,isOpen:s,className:t||"",positionX:o,positionY:d,footer:c,autoClose:!0,onClose:()=>{f(!1)}},n))}},function(e,t,n){"use strict";var r=n(0),u=n(22),o=n(1),d=n(26);const c=new Set(["key","ref","teactFastList","teactOrderKey"]),a={autoPlay:"autoplay",autoComplete:"autocomplete"},i={};function s(e,t,n,u,d,{skipComponentUpdate:c=!1,forceIndex:a=!1,fragment:i,moveDirection:g}={}){if(!c&&t&&n&&Object(r.d)(t)&&Object(r.d)(n)&&!Object(r.c)(t,n)&&(n=function(e,t){return e.componentInstance.props=t.componentInstance.props,Object(r.j)(e.componentInstance)}(t,n)),!c&&n&&Object(r.d)(n)&&n.componentInstance.isMounted&&l(n,u,d,e),t===n)return n;if(!t&&n){Object(r.d)(n)&&(n=f(n,u,d,e));const t=b(n);Object(r.k)(n,t),a&&e.childNodes[d]?e.insertBefore(t,e.childNodes[d]):(i||e).appendChild(t)}else if(t&&!n)e.removeChild(Object(r.b)(t)),Object(r.l)(t);else if(t&&n)if(Object(r.c)(t,n)){Object(r.d)(n)&&(n=f(n,u,d,e));const o=b(n);Object(r.k)(n,o),e.replaceChild(o,Object(r.b)(t)),Object(r.l)(t)}else{const u=Object(r.d)(t)&&Object(r.d)(n);if(u||Object(r.k)(n,Object(r.b)(t)),Object(r.f)(t)&&Object(r.f)(n)){if(g){const n=Object(r.b)(t),u=e.childNodes["up"===g?d:d+1];u?e.insertBefore(n,u):(i||e).appendChild(n)}u||function(e,t,n){const r=Object.keys(e.props),u=Object.keys(t.props);r.forEach(r=>{void 0!==e.props[r]&&void 0===t.props[r]&&p(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?m(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(p(e,t,n),m(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return o.o&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let d=0;const c=e.children.reduce((e,r,o)=>{let c="props"in r?r.props.key:void 0;if(c&&!u.has(c))return s(n,r,void 0,t,-1),e;if(!c){const u=t.children[o],d=u&&"props"in u?u.props.key:void 0;if(!u||d)return s(n,r,void 0,t,-1),e;c="__indexKey#"+o}return e[c]={$element:r,index:d++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,f=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,o=c[u];if(!o)return a||(a=[],i=r),void a.push(e);a&&(f=f.concat(h(a,i,n,t)),i=void 0,a=void 0);const d="props"in e?e.props.teactOrderKey:void 0,b=o.index!==l&&o.order!==d,m=b&&l>o.index;b&&!m||l++,f.push(s(n,o.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:m?"down":"up"}}))}),a&&(f=f.concat(h(a,i,n,t)));return f}(e,t,n);const u=Math.max(e.children.length,t.children.length),d=[],c=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:c}:void 0);u&&d.push(u)}c&&n.appendChild(c);return d}(t,n,u?e:Object(r.b)(t))}}return n}function f(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:o}=e;if(!o.isMounted){l(e=Object(r.i)(o),t,n,u);const d=e.children[0];Object(r.d)(d)&&(e.children=[f(d,e,0,u)]),o.isMounted=!0}return e}function l(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=s(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function b(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return b(e.children[0]);const{tag:t,props:n,children:u=[]}=e,o=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=o),Object.keys(n).forEach(e=>{m(o,e,n[e])}),e.children=u.map((t,n)=>s(o,void 0,t,e,n)),o}function h(e,t,n,r){if(1===e.length)return[s(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),o=e.map(e=>s(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),o}throw new Error("Unexpected input")}function m(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(d.a)(e,t,n):t.startsWith("data-")?e.setAttribute(t,n):c.has(t)||(e[a[t]||t]=n))}function p(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(d.c)(e,t,n):t.startsWith("data-")?e.removeAttribute(t):c.has(t)||delete e[a[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(i),i[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=i[n];r.children=[s(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";var r=n(15);const u=new RegExp(`^(?:${r.a.source})+$`,"");t.a=e=>{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return o})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,o="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(55),u=n(30);let o=!1;const d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,c=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=d.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const o=Math.round(c(u[e].r,u[t].r,n)),d=Math.round(c(u[e].g,u[t].g,n)),a=Math.round(c(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(c(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${o},${d},${a},${i/255})`:`rgb(${o},${d},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=o&&t,d=n?0:1,c=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),o&&document.documentElement.classList.add("disable-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("disable-animations")},500),o=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(d,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(d,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return d}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function o(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function d(e){const t={categories:[],emojis:{}};for(let n=0;n({userOrChat:t?Object(d.Db)(e,t):void 0}),(e,t)=>Object(o.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:o})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&o({username:e.substring(1)})},className:"text-entity-link"},n))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"e4b96b4136ca0ce3a4aa.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),o=n(11),d=n(66);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(o.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.k?"is-touch-env":"is-pointer-env"),Object(d.a)(t,n>0),u.i&&document.body.classList.add("is-safari"),u.d?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0}))},function(e,t,n){"use strict";var r=n(2),u=n(1),o=n(10);Object(r.b)("initApi",(e,t)=>{const n=localStorage.getItem(u.C)||void 0;return Object(o.c)(t.apiUpdate,n),{...e,authIsSessionRemembered:Boolean(n)}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(o.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(o.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(o.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(o.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(o.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(o.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(o.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionId:r}=n;localStorage.setItem(u.C,r)}),Object(r.b)("signOut",()=>{!async function(){await Object(o.a)("destroy"),localStorage.removeItem(u.C),Object(r.d)().init()}()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(o.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()})},function(e,t,n){"use strict";var r=n(2),u=n(1),o=n(10);function d(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}var c=n(38),a=n(11);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.o&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(a.c)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":{if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()});const{sessionId:u}=e;u&&t.authRememberMe&&Object(r.d)().saveSession({sessionId:u});break}}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?(Object(r.d)().sync(),async function(){if(!("showNotification"in ServiceWorkerRegistration.prototype))return void(u.o&&console.log("[PUSH] Push notifications aren't supported."));if("denied"===Notification.permission)return void(u.o&&console.log("[PUSH] The user has blocked push notifications."));"PushManager"in window||u.o&&console.log("[PUSH] Push messaging isn't supported.");const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(t)try{const e=d(t);await Object(o.a)("unregisterDevice",e),await t.unsubscribe()}catch(e){u.o&&console.log("[PUSH] Unable to unsubscribe from push.",e)}try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=d(t);u.o&&console.log("[PUSH] Received push subscription: ",n);const r=await Object(o.a)("registerDevice",n);u.o&&console.log("[PUSH] registerDevice result",r)}catch(e){"denied"===Notification.permission?u.o&&console.log("[PUSH] Permission for Notifications was denied"):u.o&&console.log("[PUSH] Unable to subscribe to push.",e)}}()):"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(c.lb)(Object(r.e)(),t.id,t),currentUserId:t.id})}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(21),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(1),o=n(2),d=n(7);d.j&&window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.o&&console.log("ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?u.o&&console.log("ServiceWorker ready"):(u.o&&console.error("ServiceWorker not available"),Object(o.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.o&&console.error("ServiceWorker registration failed: ",e)}});var c=n(57);const a={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{}},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.r,isBackgroundBlurred:!0,patternColor:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},privacy:{}},twoFaSettings:{}};var i=n(5),s=n(9),f=n(3),l=n(6);const b=Object(s.g)((function(){Object(s.c)(()=>{const e=Object(o.e)();if(e.isLoggingOut)return;const t={...a,...Object(f.l)(e,["authState","authPhoneNumber","authRememberMe","authIsSessionRemembered","authNearestCountry","currentUserId","contactList","chatFolders","topPeers","recentEmojis"]),isChatInfoShown:m(e),users:p(e),chats:g(e),messages:y(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:v(e)},n=JSON.stringify(t);localStorage.setItem(u.A,n)})}),1e3,!1);function h(e){if(!u.z){if(localStorage.getItem(u.C))return Object(o.a)(b),function(e){u.o&&console.time("global-state-cache-read");const t=localStorage.getItem(u.A),n=t?JSON.parse(t):void 0;u.o&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey});return{...e,...n}}(e)}}function m(e){return window.innerWidth>u.W&&e.isChatInfoShown}function p(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.y).filter(e=>e>0),...Object.keys(t)].slice(0,u.B);return{byId:Object(f.l)(t,r),selectedId:window.innerWidth>u.W?n:void 0}}function g(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.y)],{chatId:n}=Object(l.y)(e)||{};return{...e.chats,byId:Object(f.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function y(e){const t={},{chatId:n}=Object(l.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.y),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[i.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(f.l)(r.byId,u.viewportIds),threadsById:{[i.MAIN_THREAD_ID]:u}})});const r=Object(l.y)(e);return{byChatId:t,messageLists:!r||d.f?void 0:[{...r,threadId:i.MAIN_THREAD_ID,type:"thread"}]}}function v(e){const{byKey:t}=e.settings;return{byKey:t,privacy:{}}}u.z||(Object(o.b)("saveSession",()=>{Object(o.a)(b)}),Object(o.b)("signOut",()=>{Object(o.f)(b),localStorage.removeItem(u.A)})),Object(o.b)("init",()=>{const e=Object(f.d)(a),t=h(e)||e,n=Object(l.y)(t)||{};return window.history.replaceState(n,""),t});var I=n(0),w=n(49),O=(n(74),n(75),n(76),n(24)),C=n(36),j=n(27),E=n(14);const S=["400 1em Roboto","500 1em Roboto"];function M(){if("fonts"in document)return Promise.all(S.map(e=>document.fonts.load(e)))}var A=n(48),k=n(12),T=n(8),P=(n(77),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),N=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function D(){const{listIds:e,byId:t}=Object(o.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(O.d)(n);return r?A.b(r,i.ApiMediaFormat.DataUri):void 0}))}const F={main:()=>Promise.all([Object(k.d)(k.a.Main,"Main").then(M),D()]),authPhoneNumber:()=>Promise.all([M(),Object(E.g)(P)]),authCode:()=>Object(E.g)(N),authPassword:()=>Object(E.g)(N),authQrCode:M};var L=Object(o.h)(e=>({uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(e.settings.byKey.customBackground),isCustomBackgroundColor:Boolean((e.settings.byKey.customBackground||"").match(/^#[a-f\d]{6,8}$/i)),isRightColumnShown:Object(l.V)(e)}),(e,t)=>Object(f.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,isCustomBackgroundColor:r,isRightColumnShown:u,setIsUiReady:o})=>{const[d,c]=Object(C.a)(),{shouldRender:a,transitionClassNames:i}=Object(j.a)(!d,void 0,!0);return Object(I.n)(()=>{let t;return Promise.race([Object(s.e)(700),F[e]()]).then(()=>{c(),o({uiReadyState:1}),t=window.setTimeout(()=>{o({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),o({uiReadyState:0})}},[]),I.a.createElement("div",{id:"UiLoader"},t,a&&I.a.createElement("div",{className:Object(T.a)("mask",i)},"main"===e?I.a.createElement(I.a.Fragment,null,I.a.createElement("div",{className:"left"}),I.a.createElement("div",{className:Object(T.a)("middle",n&&!r&&"custom-bg-image",n&&r&&"custom-bg-color",u&&"with-right-column")}),u&&I.a.createElement("div",{className:"right"})):I.a.createElement("div",{className:"blank"})))}),x=n(13),B=n(19),R=n(31),U=n(39),_=n(46),G=n(35),$=n(56),W=n(32),H=n(20);n(84);const z=200+u.c;var K=Object(I.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(I.q)(null),[o,d]=Object(I.r)(),[c,a]=Object(I.r)(B.a);function i(e){d(e),a(function(e=""){return e.length?B.a.filter(t=>Object(_.a)(t.name,e)):B.a}(e))}const s=Object(I.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=B.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),z)},[r]),f=Object(I.m)(e=>{i(e.currentTarget.value)},[]),l=Object(I.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===o&&(n.value=""),i(n.value)},[o,t]);return I.a.createElement($.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:d})=>{const c=()=>{if(d)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==o?o:t&&t.name||"";return I.a.createElement("div",{className:Object(T.a)("input-group",t&&"touched")},I.a.createElement("input",{ref:u,className:Object(T.a)("form-control",d&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),I.a.createElement("label",null,"Country"),n?I.a.createElement(H.a,{color:"black"}):I.a.createElement("i",{onClick:c,className:Object(T.a)("css-icon-down",d&&"open")}))}},c.map(e=>I.a.createElement(W.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},I.a.createElement("span",{"data-country-id":e.id}),I.a.createElement("span",{className:"country-flag"},Object(G.a)(e.flag,["hq_emoji"])),I.a.createElement("span",{className:"country-name"},e.name),I.a.createElement("span",{className:"country-code"},e.code))),!c.length&&I.a.createElement(W.a,{key:"no-results",className:"no-results",disabled:!0},I.a.createElement("span",null,"No countries matched your filter.")))}),V=n(40),q=n(16);let J=!1;var Y=Object(I.h)(Object(o.h)(e=>Object(f.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(f.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:o,authError:c,authRememberMe:a,authNearestCountry:i,setAuthPhoneNumber:s,setAuthRememberMe:f,loadNearestCountry:l,clearAuthError:b,gotToAuthQrCode:h})=>{const m=Object(I.q)(null),[p,g]=Object(I.r)(),[y,v]=Object(I.r)(),[w,O]=Object(I.r)(!1),[C,j]=Object(I.r)(),S=p?`${p.code} ${y||""}`:y,A=S&&S.replace(/[^\d]+/g,"").length>=10;Object(I.n)(()=>{d.k||m.current.focus()},[p]),Object(I.n)(()=>{"connectionStateReady"!==e||i||l()},[e,i,l]),Object(I.n)(()=>{!i||p||w||g(Object(B.d)(i))},[p,i,w]);const k=Object(I.m)(e=>{const t=Object(B.e)(e),n=!p||t&&t.id!==p.id?t:p;e.length?(!p||n&&n.code!==p.code)&&g(n):g(void 0),v(Object(B.b)(e,n))},[p]);Object(I.n)(()=>{void 0===y&&n&&k(n)},[n,y,k]),Object(I.o)(()=>{m.current&&C&&m.current.setSelectionRange(...C)},[C]),Object(I.n)(()=>{setTimeout(()=>{x.b(u.L),x.b(u.M),x.b(u.N),x.b(u.l),x.b(u.E)},2e3)},[]);const T=Object(I.m)(e=>{c&&b(),J||(J=!0,M(),Object(E.g)(N));const{value:t,selectionStart:n,selectionEnd:r}=e.target;j(n&&r&&r{f(e.target.checked)},[f]);const D="authorizationStateWaitPhoneNumber"===t;return I.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},I.a.createElement("div",{className:"auth-form"},I.a.createElement("div",{id:"logo"}),I.a.createElement("h2",null,"Sign in to Telegram"),I.a.createElement("p",{className:"note"},"Please confirm your country and",I.a.createElement("br",null),"enter your phone number."),I.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||A&&s({phoneNumber:S})}},I.a.createElement(K,{id:"sign-in-phone-code",value:p,isLoading:!i&&!p,onChange:g}),I.a.createElement(U.a,{ref:m,id:"sign-in-phone-number",label:"Phone Number",value:S,error:c,inputMode:"tel",onChange:T}),I.a.createElement(V.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(a),onChange:P}),A&&(D?I.a.createElement(R.a,{type:"submit",ripple:!0,isLoading:r},"Next"):I.a.createElement(q.a,null)),D&&I.a.createElement(R.a,{isText:!0,ripple:!0,isLoading:o,onClick:h},"Log in by QR code"))))})),Q=n(17);var Z=()=>{const e=Object(Q.a)(k.a.Auth,"AuthCode");return e?I.a.createElement(e,null):I.a.createElement(q.a,null)};var X=()=>{const e=Object(Q.a)(k.a.Auth,"AuthPassword");return e?I.a.createElement(e,null):I.a.createElement(q.a,null)};var ee=()=>{const e=Object(Q.a)(k.a.Auth,"AuthRegister");return e?I.a.createElement(e,null):I.a.createElement(q.a,null)};var te=()=>{const e=Object(Q.a)(k.a.Auth,"AuthQrCode");return e?I.a.createElement(e,null):I.a.createElement(q.a,null)};n(87);var ne=Object(I.h)(Object(o.h)(e=>Object(f.l)(e,["authState"]),(e,t)=>Object(f.l)(t,["initApi"]))(({authState:e,initApi:t})=>{switch(Object(I.n)(()=>{t()},[t]),e){case"authorizationStateWaitCode":return I.a.createElement(L,{page:"authCode",key:"authCode"},I.a.createElement(Z,null));case"authorizationStateWaitPassword":return I.a.createElement(L,{page:"authPassword",key:"authPassword"},I.a.createElement(X,null));case"authorizationStateWaitRegistration":return I.a.createElement(ee,null);case"authorizationStateWaitQrCode":return I.a.createElement(L,{page:"authQrCode",key:"authQrCode"},I.a.createElement(te,null));case"authorizationStateWaitPhoneNumber":default:return I.a.createElement(L,{page:"authPhoneNumber",key:"authPhoneNumber"},I.a.createElement(Y,null))}}));var re=()=>{const e=Object(Q.a)(k.a.Main,"Main");return e?I.a.createElement(e,null):void 0};function ue(){return o.c.createElement(L,{page:"main",key:"main"},o.c.createElement(re,null))}var oe=Object(o.h)(e=>Object(f.l)(e,["authState","authIsSessionRemembered"]))(({authState:e,authIsSessionRemembered:t})=>{if(Object(I.n)(()=>{Object(w.b)()},[]),e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return o.c.createElement(ne,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return ue()}return t?ue():o.c.createElement(ne,null)});n(88);u.o&&console.log(">>> INIT"),Object(o.d)().init(),u.o&&console.log(">>> START INITIAL RENDER"),c.a.render(o.c.createElement(oe,null),document.getElementById("root")),u.o&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(o.e)())})}]); -//# sourceMappingURL=main.7a5c484269dea8524beb.js.map \ No newline at end of file +!function(e){function t(t){for(var n,r,o=t[0],d=t[1],c=0,a=[];c=0&&I(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),O[n].renderTimes.push(t),O[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const o=w(u);return e.$element=y(e,[o]),e.$element}function j(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function E(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(E))}function S(e){return C(e),e.isMounted=!0,e.$element}function M(e){return m(e)?M(e.children[0]):e.target}function A(e,t){m(e)?A(e.children[0],t):e.target=t}function k(e){const{cursor:t,byCursor:n}=f.hooks.state;var r;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(r=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,r.scheduleNextState&&r.forceUpdate||(r.scheduleNextState=Object(u.h)(()=>function(e){e.isMounted&&e.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue})}(r)),r.forceUpdate=Object(u.i)(()=>function(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;C(e),e.$element!==t&&e.onUpdate()}(r))),r.scheduleNextState(),r.forceUpdate())})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function T(e,t,n){const{cursor:r,byCursor:u}=f.hooks.effects,o=f,d=()=>{if(!o.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(d):e(d),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return T(u.b,e,t)}function N(e,t){return T(u.d,e,t)}function D(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function F(e,t){return D(()=>e,t)}function L(e){return D(()=>({current:e}),[])}function x(e,t=d.a){return function(n){const r=L(n),u=L();return(!u.current||r.current&&!t(r.current,n))&&(r.current=n,u.current=g(e,n)),u.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(o.k)(Object.values(O),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"f",(function(){return r})),n.d(t,"o",(function(){return u})),n.d(t,"q",(function(){return o})),n.d(t,"D",(function(){return d})),n.d(t,"p",(function(){return c})),n.d(t,"C",(function(){return a})),n.d(t,"z",(function(){return i})),n.d(t,"A",(function(){return s})),n.d(t,"y",(function(){return f})),n.d(t,"B",(function(){return l})),n.d(t,"K",(function(){return b})),n.d(t,"L",(function(){return h})),n.d(t,"M",(function(){return m})),n.d(t,"N",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"E",(function(){return y})),n.d(t,"U",(function(){return I})),n.d(t,"Q",(function(){return w})),n.d(t,"R",(function(){return O})),n.d(t,"S",(function(){return C})),n.d(t,"h",(function(){return j})),n.d(t,"j",(function(){return E})),n.d(t,"i",(function(){return S})),n.d(t,"hb",(function(){return M})),n.d(t,"T",(function(){return A})),n.d(t,"x",(function(){return k})),n.d(t,"wb",(function(){return T})),n.d(t,"a",(function(){return P})),n.d(t,"e",(function(){return N})),n.d(t,"d",(function(){return D})),n.d(t,"r",(function(){return F})),n.d(t,"t",(function(){return L})),n.d(t,"u",(function(){return x})),n.d(t,"v",(function(){return B})),n.d(t,"eb",(function(){return R})),n.d(t,"db",(function(){return U})),n.d(t,"W",(function(){return _})),n.d(t,"V",(function(){return G})),n.d(t,"Z",(function(){return $})),n.d(t,"Y",(function(){return W})),n.d(t,"X",(function(){return H})),n.d(t,"H",(function(){return z})),n.d(t,"c",(function(){return K})),n.d(t,"ob",(function(){return V})),n.d(t,"pb",(function(){return q})),n.d(t,"jb",(function(){return J})),n.d(t,"kb",(function(){return Y})),n.d(t,"rb",(function(){return Q})),n.d(t,"nb",(function(){return Z})),n.d(t,"sb",(function(){return X})),n.d(t,"tb",(function(){return ee})),n.d(t,"qb",(function(){return te})),n.d(t,"ub",(function(){return ne})),n.d(t,"lb",(function(){return re})),n.d(t,"mb",(function(){return ue})),n.d(t,"O",(function(){return oe})),n.d(t,"P",(function(){return de})),n.d(t,"ib",(function(){return ce})),n.d(t,"G",(function(){return ae})),n.d(t,"k",(function(){return ie})),n.d(t,"ab",(function(){return se})),n.d(t,"cb",(function(){return fe})),n.d(t,"bb",(function(){return le})),n.d(t,"gb",(function(){return be})),n.d(t,"b",(function(){return he})),n.d(t,"g",(function(){return me})),n.d(t,"J",(function(){return pe})),n.d(t,"I",(function(){return ge})),n.d(t,"fb",(function(){return ye})),n.d(t,"F",(function(){return ve})),n.d(t,"vb",(function(){return Ie})),n.d(t,"w",(function(){return we})),n.d(t,"m",(function(){return Oe})),n.d(t,"n",(function(){return Ce})),n.d(t,"s",(function(){return je}));const r="Telegram WebZ alpha ccff995",u=!1,o=!1,d=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",a="GramJs:sessionId",i=!1,s="tt-global-state",f=30,l=5e3,b=!1,h="tt-media",m="tt-media-avatars",p="tt-media-progressive",g="tt-custom-bg",y="tt-lang-packs",v=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),I=1,w=750,O=v?60:40,C=2*O,j=72,E=v?30:25,S=100,M=42,A=42,k=20,T=25,P=!1,N=2,D=N,F=16,L=1e4,x="editable-message-text",B="editable-message-text-modal",R=1440,U=1150,_=1275,G=925,$=600,W=950,H=450,z=1e9,K=100,V=13,q=11,J=160,Y=120,Q=64,Z=48,X=32,ee=64,te=64,ne=160,re=140,ue=80,oe="MEMOJI_STICKER",de=200,ce=450,ae=450,ie="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",se="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",fe=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,le=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,be=777e3,he=0,me=1,pe=10,ge=5,ye=2147483646,ve=["android","ios"],Ie="TelegramTips",we="https://bugs.telegram.org/?tag_ids=41&sort=time",Oe="#0F0F0F",Ce="#0a0a0a8c",je="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";n.d(t,"g",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"d",(function(){return I})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return O})),n.d(t,"f",(function(){return C})),n.d(t,"h",(function(){return j}));var r=n(0),u=n(1),o=n(29),d=n(22),c=n(9),a=n(25),i=n(3),s=n(21);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;const g=Object(c.i)((function(){h.forEach(e=>e(l))}));function y(e){"object"==typeof e&&e!==l&&(l=e,g())}function v(){return l}function I(){return m}function w(e,t){b[e]||(b[e]=[],m[e]=t=>{!function(e,t){b[e]&&b[e].forEach(e=>{const n=e(l,m,t);n&&y(n)})}(e,t)}),b[e].push(t)}function O(e){h.push(e)}function C(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function j(e=(()=>({})),t=(()=>({}))){return n=>function(u){const[c]=Object(r.r)(Object(d.a)(p)),i=Object(o.a)();Object(r.n)(()=>()=>{p.delete(c)},[c]);let b=p.get(c);if(b||(b={mapStateToProps:e,mapReducersToProps:t,ownProps:u,areMappedPropsChanged:!1,forceUpdate:i,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(c,b)),b.areMappedPropsChanged&&(b.areMappedPropsChanged=!1),!b.mappedProps||!Object(a.a)(b.ownProps,u)){b.ownProps=u;try{b.mappedProps={...e(l,u),...t(y,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},b.mappedProps,u))}}function E(e,t){const n=Object.keys(e);return n.length!==Object.keys(t).length?["LENGTH"]:n.filter(n=>e[n]!==t[n])}u.o&&(window.getGlobal=v,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function o(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function d(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function c(e,t){const n=new Set(t.map(String));return o(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,o]=Array.isArray(n)?n:[n,n],[d,c]=t;let a,i;if("function"==typeof d?(a=d(e)||0,i=d(r)||0):"string"==typeof d&&(a=e[d]||0,i=r[d]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof c?(t=c(e)||0,n=c(r)||0):"string"==typeof c&&(t=e[c]||0,n=r[c]||0),"asc"===o?t-n:n-t}}let u,o;return"function"==typeof t?(u=t(e)||0,o=t(r)||0):"string"==typeof t&&(u=e[t]||0,o=r[t]||0),"asc"===n?u-o:o-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return o})),n.d(t,"m",(function(){return d})),n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"Y",(function(){return r.c})),n.d(t,"Z",(function(){return r.d})),n.d(t,"ab",(function(){return r.e})),n.d(t,"xb",(function(){return r.h})),n.d(t,"pb",(function(){return r.f})),n.d(t,"wb",(function(){return r.g})),n.d(t,"W",(function(){return r.a})),n.d(t,"X",(function(){return r.b})),n.d(t,"lb",(function(){return u.w})),n.d(t,"kb",(function(){return u.v})),n.d(t,"ib",(function(){return u.t})),n.d(t,"nb",(function(){return u.y})),n.d(t,"jb",(function(){return u.u})),n.d(t,"ob",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"T",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"mb",(function(){return u.x})),n.d(t,"gb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"yb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"J",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"hb",(function(){return u.s})),n.d(t,"d",(function(){return u.b})),n.d(t,"Bb",(function(){return u.C})),n.d(t,"Ab",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"fb",(function(){return u.q})),n.d(t,"I",(function(){return u.n})),n.d(t,"A",(function(){return i})),n.d(t,"zb",(function(){return s})),n.d(t,"F",(function(){return f})),n.d(t,"M",(function(){return l})),n.d(t,"N",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"K",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"tb",(function(){return g})),n.d(t,"ub",(function(){return y})),n.d(t,"qb",(function(){return v})),n.d(t,"db",(function(){return I})),n.d(t,"vb",(function(){return w})),n.d(t,"eb",(function(){return O})),n.d(t,"U",(function(){return C})),n.d(t,"V",(function(){return j})),n.d(t,"sb",(function(){return E})),n.d(t,"rb",(function(){return S})),n.d(t,"v",(function(){return k})),n.d(t,"cb",(function(){return T})),n.d(t,"G",(function(){return P})),n.d(t,"O",(function(){return N})),n.d(t,"t",(function(){return D})),n.d(t,"u",(function(){return F})),n.d(t,"L",(function(){return L})),n.d(t,"y",(function(){return x})),n.d(t,"H",(function(){return B})),n.d(t,"z",(function(){return R})),n.d(t,"P",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"E",(function(){return G})),n.d(t,"D",(function(){return $})),n.d(t,"C",(function(){return H})),n.d(t,"B",(function(){return z})),n.d(t,"b",(function(){return V})),n.d(t,"i",(function(){return q})),n.d(t,"R",(function(){return J})),n.d(t,"S",(function(){return Y})),n.d(t,"bb",(function(){return Q})),n.d(t,"s",(function(){return Z})),n.d(t,"w",(function(){return X})),n.d(t,"r",(function(){return ee})),n.d(t,"a",(function(){return te}));var r=n(23),u=n(24),o=n(5),d=n(1),c=n(59);const a=new RegExp(d.ab,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t=!1){const{text:n,photo:r,video:u,audio:o,voice:d,document:c,sticker:a,contact:i,poll:s,invoice:f}=e.content;if(e.groupedId)return n?`${t?"":"🖼 "}${n.text}`:"Album";if(r)return n?`${t?"":"🖼 "}${n.text}`:"Photo";if(u)return u.isGif?n?`${t?"":"GIF "}${n.text}`:"GIF":n?`${t?"":"📹 "}${n.text}`:"Video";if(a)return"Sticker "+a.emoji;if(o){const e=[o.title,o.performer].filter(Boolean).join(" — ")||n&&n.text;return e?"🎧 "+e:"Audio"}return d?n?`${t?"":"🎤 "}${n.text}`:"Voice Message":c?`${t?"":"📎 "}${n?n.text:c.fileName}`:i?"Contact":s?"📊 "+s.summary.question:f?"Invoice":n?n.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||o||d||c||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||o||d||a||i||s||f)&&(Object(c.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function I(e){return!!e.content.action}function w(e){return e.chatId===d.gb&&E(e)}function O(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function C(e){return e.id>0?Object(r.d)(e):Object(u.i)(e)}function j(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function E(e){return e.id>=d.H}function S(e){return e.content.action&&"historyClear"===e.content.action.type}var M=n(7),A=n(54);function k(e){return e.content}function T(e){return Boolean(P(e)||N(e)||x(e)||L(e)||function(e){return e.content.contact}(e)||B(e)||D(e)||F(e)||function(e){return e.content.voice}(e))}function P(e){return e.content.photo}function N(e){return e.content.video}function D(e){return e.content.action}function F(e){return e.content.audio}function L(e){return e.content.sticker}function x(e){return e.content.document}function B(e){return e.content.poll}function R(e){return e.content.invoice}function U(e){return e.content.webPage}function _(e){const t=U(e);return t?t.photo:void 0}function G(e){const t=function(e){const t=P(e)||N(e)||x(e)||L(e)||_(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function $(e,t){const{photo:n,video:r,sticker:u,audio:o,voice:d,document:c}=e.content,a=_(e);if(!(n||r||u||a||o||d||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(K(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(K(e))return;return V(r)?W(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return W(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(A.c)(c)||K(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(o)switch(t){case"micro":case"pictogram":return;default:return W(o,s)}if(d)switch(t){case"micro":case"pictogram":return;default:return s}}function W(e,t){return M.h&&M.i?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function H(e,t){const{sticker:n,video:r,audio:u,voice:d}=e.content;return n&&"inline"===t&&n.isAnimated?o.ApiMediaFormat.Lottie:r&&M.h&&("viewerFull"===t||"inline"===t&&V(r))?o.ApiMediaFormat.Progressive:u||d?d&&!M.g?o.ApiMediaFormat.BlobUrl:o.ApiMediaFormat.Progressive:o.ApiMediaFormat.BlobUrl}function z(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function K(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function V(e){return e.isGif||e.isRound||e.size<=10485760}function q(e,t,n=!1){const r=X(e,t,"media");return n?r.reverse():r}function J(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Y(e)}function Y(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function Q(e){if(e.width&&e.height)return e}function Z(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function X(e,t,n){let r;switch(n){case"media":r=e=>{const t=N(e);return P(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=x;break;case"links":r=e=>U(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=F;break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function ee(e){const{audio:t,voice:n,video:r}=k(e),u=t||n||r;if(u)return u.duration}function te(e,t){return`${e}_${t}`}n(55)},function(e,t,n){"use strict";var r=n(60);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(61);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var o=n(62);n.d(t,"ApiMessageEntityTypes",(function(){return o.a})),n.d(t,"MAIN_THREAD_ID",(function(){return o.b})),n.d(t,"MESSAGE_DELETED",(function(){return o.c}));var d=n(63);n.o(d,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return d.ApiMediaFormat}));var c=n(64);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(65),n(66)},function(e,t,n){"use strict";n.d(t,"S",(function(){return Pe})),n.d(t,"kb",(function(){return Ne})),n.d(t,"V",(function(){return De})),n.d(t,"Db",(function(){return a})),n.d(t,"f",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"O",(function(){return f})),n.d(t,"N",(function(){return l})),n.d(t,"xb",(function(){return b})),n.d(t,"n",(function(){return h})),n.d(t,"g",(function(){return m})),n.d(t,"K",(function(){return p})),n.d(t,"d",(function(){return g})),n.d(t,"L",(function(){return y})),n.d(t,"j",(function(){return v})),n.d(t,"i",(function(){return I})),n.d(t,"M",(function(){return w})),n.d(t,"h",(function(){return O})),n.d(t,"q",(function(){return C})),n.d(t,"y",(function(){return T})),n.d(t,"r",(function(){return P})),n.d(t,"m",(function(){return N})),n.d(t,"nb",(function(){return D})),n.d(t,"X",(function(){return L})),n.d(t,"db",(function(){return x})),n.d(t,"x",(function(){return B})),n.d(t,"Eb",(function(){return R})),n.d(t,"gb",(function(){return U})),n.d(t,"lb",(function(){return _})),n.d(t,"ob",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"C",(function(){return W})),n.d(t,"E",(function(){return H})),n.d(t,"B",(function(){return z})),n.d(t,"bb",(function(){return K})),n.d(t,"zb",(function(){return V})),n.d(t,"F",(function(){return q})),n.d(t,"Ab",(function(){return J})),n.d(t,"Bb",(function(){return Y})),n.d(t,"yb",(function(){return Q})),n.d(t,"a",(function(){return Z})),n.d(t,"W",(function(){return X})),n.d(t,"k",(function(){return ee})),n.d(t,"mb",(function(){return te})),n.d(t,"D",(function(){return ne})),n.d(t,"l",(function(){return re})),n.d(t,"H",(function(){return ue})),n.d(t,"T",(function(){return oe})),n.d(t,"cb",(function(){return de})),n.d(t,"qb",(function(){return ce})),n.d(t,"J",(function(){return ae})),n.d(t,"b",(function(){return ie})),n.d(t,"e",(function(){return se})),n.d(t,"Cb",(function(){return fe})),n.d(t,"ib",(function(){return le})),n.d(t,"G",(function(){return be})),n.d(t,"Q",(function(){return he})),n.d(t,"p",(function(){return me})),n.d(t,"R",(function(){return pe})),n.d(t,"U",(function(){return ge})),n.d(t,"I",(function(){return ye})),n.d(t,"Z",(function(){return ve})),n.d(t,"P",(function(){return Ie})),n.d(t,"pb",(function(){return we})),n.d(t,"ab",(function(){return Oe})),n.d(t,"rb",(function(){return Ce})),n.d(t,"sb",(function(){return je})),n.d(t,"tb",(function(){return Ee})),n.d(t,"t",(function(){return Fe})),n.d(t,"A",(function(){return Se})),n.d(t,"w",(function(){return Me})),n.d(t,"v",(function(){return Ae})),n.d(t,"Y",(function(){return ke})),n.d(t,"u",(function(){return Te})),n.d(t,"z",(function(){return E})),n.d(t,"s",(function(){return S})),n.d(t,"ub",(function(){return M})),n.d(t,"vb",(function(){return A})),n.d(t,"c",(function(){return k})),n.d(t,"eb",(function(){return Le})),n.d(t,"fb",(function(){return xe})),n.d(t,"hb",(function(){return Be})),n.d(t,"wb",(function(){return Re}));var r=n(18),u=n(7),o=n(5),d=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e,t){return e.chats.byId[t]}function s(e,t){const n=Object(c.T)(t);return!!n&&a(e,n)}function f(e,t){return t===e.currentUserId}function l(e,t){const n=s(e,t);return n&&Object(c.wb)(n)}function b(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function h(e,t){if(Object(c.lb)(t.id)||Object(c.jb)(t))return;if(Object(c.nb)(t))return t.onlineCount;if(!t.fullInfo||!t.fullInfo.members)return;return t.fullInfo.members.map(e=>e.userId).reduce((t,n)=>e.users.byId[n]&&Object(c.xb)(e.users.byId[n])?t+1:t,0)}function m(e,t){const n=i(e,t),r=n&&Object(c.T)(n),u=r&&a(e,r);if(u&&Object(c.wb)(u))return u}function p(e,t){const n=i(e,t),r=m(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.rb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:d}=u.threadsById[o.MAIN_THREAD_ID]||{};return d&&!d.length}function g(e){return Boolean(e.chats.listIds.active)}function y(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function v(e,t){const n=i(e,t);if(n&&y(e,t))return n.folderId===d.g?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function w(e,t,n=d.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===d.b)return!!r&&r.includes(t);if(n===d.g)return!!u&&u.includes(t);const{byId:o}=e.chatFolders,{pinnedChatIds:c}=o[n]||{};return!!c&&c.includes(t)}function O(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function C(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((e,t)=>{const r=n[t];return r&&r.unreadCount&&!r.isMuted?e+r.unreadCount:e},0)}var j=n(3);function E(e){return e.stickers.search}function S(e){return e.gifs.search}function M(e,t){return e.stickers.setsById[t]}function A(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function k(e,t){const{animatedEmojis:n}=e;if(n&&n.stickers)return t=t.replace("️",""),n.stickers.find(e=>e.emoji===t)}function T(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function P(e){const{chatId:t}=T(e)||{};return t?i(e,t):void 0}function N(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function D(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function F(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const o=u.threadsById[n];return o?o[r]:void 0}function L(e,t,n){return F(e,t,n,"listedIds")}function x(e,t,n){return F(e,t,n,"outlyingIds")}function B(e,t,n,r){switch(r){case"thread":return R(e,t,n);case"pinned":return U(e,t);case"scheduled":return _(e,t)}}function R(e,t,n){return F(e,t,n,"viewportIds")}function U(e,t){return F(e,t,o.MAIN_THREAD_ID,"pinnedIds")}function _(e,t){return F(e,t,o.MAIN_THREAD_ID,"scheduledIds")}function G(e,t,n){return F(e,t,n,"scrollOffset")}function $(e,t,n){return F(e,t,n,"replyingToId")}function W(e,t,n){return F(e,t,n,"editingId")}function H(e,t){return F(e,t,o.MAIN_THREAD_ID,"editingScheduledId")}function z(e,t,n){return F(e,t,n,"draft")}function K(e,t,n){return F(e,t,n,"noWebPage")}function V(e,t,n){return F(e,t,n,"threadInfo")}function q(e,t,n){return F(e,t,n,"firstMessageId")}function J(e,t,n){if(n===o.MAIN_THREAD_ID)return i(e,t);const r=V(e,t,n);return r?i(e,r.originChannelId||t):void 0}function Y(e,t,n){if(n===o.MAIN_THREAD_ID)return;const r=V(e,t,n);return r?r.topMessageId:void 0}function Q(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:o}=n;return u||o?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||o&&o===e.threadInfo.topMessageId)):void 0}function Z(e,t,n){const r=T(e);if(!r)return!1;const{threadInfo:u}=Q(e,t,n)||{};return t===r.chatId&&(r.threadId===o.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function X(e,t,n){const r=R(e,t,n);if(!r||!r.length)return!0;let u;if(n===o.MAIN_THREAD_ID){const n=i(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=V(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=d.H&&!ee(e,t,u)||r[r.length-1]>=u}function ee(e,t,n){const r=N(e,t);return r?r[n]:void 0}function te(e,t,n){const r=D(e,t);return r?r[n]:void 0}function ne(e,t,n,r){if("scheduled"===r){const n=H(e,t);return n?te(e,t,n):void 0}{const r=W(e,t,n);return r?ee(e,t,r):void 0}}function re(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ue(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function oe(e,t){const n=ue(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function de(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=i(e,t.chatId)||{};return Object(c.sb)(t)||!n||n0?a(e,n):i(e,n)}function ae(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?i(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function ie(e,t,n){const r=i(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.lb)(r.id),o=f(e,t.chatId),d=Object(c.ib)(r),a=Object(c.nb)(r),s=Object(c.jb)(r),l=Object(c.vb)(t),b=Object(c.tb)(t),h=Object(c.db)(t),{content:m}=t,p=(o||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.qb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!l,y=u||r.isCreator||!s&&!Object(c.yb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,I=!1;const w=U(e,r.id);v&&(I=Boolean(w&&w.includes(t.id)),v=!I);const O=u||b||d||r.isCreator||Object(c.q)(r,"deleteMessages"),C=O&&!l&&(u&&!o||d&&(b||Object(c.q)(r,"deleteMessages"))),j=!h&&p&&(b||s&&(r.isCreator||Object(c.q)(r,"editMessages"))),E=!h&&!l,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,T=!h,P=!h&&(s||a),N=!h;return{noOptions:[g,j,v,I,O,C,E,A,k,T,P,N].every(e=>!e),canReply:g,canEdit:j,canPin:v,canUnpin:I,canDelete:O,canDeleteForAll:C,canForward:E,canFaveSticker:A,canUnfaveSticker:k,canCopy:T,canCopyLink:P,canSelect:N}}function se(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=T(e)||{},u=n&&N(e,n);if(!u||!t||!r)return{};const o=t.map(t=>u[t]&&ie(e,u[t],r)).filter(Boolean);return{canDelete:o.every(e=>e.canDelete),canDeleteForAll:o.every(e=>e.canDeleteForAll)}}function fe(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function le(e,t,n){if(n===o.MAIN_THREAD_ID){const n=i(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.sb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=V(e,t,n);if(!r)return;return r.lastReadInboxMessageId?r.lastMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId):r.lastReadInboxMessageId:r.topMessageId}}function be(e,t,n){if(n===o.MAIN_THREAD_ID){if(!i(e,t))return}else{const r=V(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const r=x(e,t,n),u=L(e,t,n),d=N(e,t);if(!d||!r&&!u)return;const c=le(e,t,n);if(r){const e=r.find(e=>!c||e>c&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled));if(e)return e}if(u){const e=u.find(e=>!c||e>c&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled));if(e)return e}}function he(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function me(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.ob)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=i(e,Number(n));return u&&Object(c.ob)(u)&&r[u.id].byId[t]}))}function pe(e){const{selectedMessages:t}=e;return Boolean(t)}function ge(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function ye(e,t,n){const r=N(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function ve(e,t,n){const r=N(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Ie(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=ve(e,t,n);return u&&u.every(e=>r.includes(e))}function we(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Oe(e,t){const n=i(e,t);if(!n)return;if(!l(e,n))return;const r=N(e,t),u=R(e,t,o.MAIN_THREAD_ID);if(!r||!u)return;const d=Object(j.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(j.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return d&&c&&c>d?void 0:d?r[d]:void 0}function Ce(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:o,shouldAutoDownloadMediaInGroups:d,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(o&&Object(c.lb)(n.id)||d&&Object(c.kb)(n)||a&&Object(c.jb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function je(e,t){const n=Object(c.O)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,o=n.isGif||n.isRound;return r&&!o||u&&o}function Ee(e){return e.settings.byKey.shouldLoopStickers}function Se(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;const r=Object(c.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Me(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=T(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ae(e){const t=Me(e);if(t)return e.localMediaSearch.byChatId[t]}function ke(e,t){return e.management.byChatId[t]}function Te(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;if(Object(c.lb)(t))return"user";const r=i(e,t);return r?Object(c.kb)(r)?"group":"channel":void 0}function Pe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Ne(e){const{users:t,isChatInfoShown:n,isStatisticsShown:o}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),c=Boolean(!u.f&&Se(e)),a=function(e){const{chatId:t,threadId:n}=T(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),i=void 0!==E(e).query,s=void 0!==S(e).query,{chatId:f}=T(e)||{},l=t.selectedId,b=g(e),h=Boolean(l&&b),m=Boolean(f&&b)&&n;return d?r.l.PollResults:c?r.l.Search:a?r.l.Management:o?r.l.Statistics:i?r.l.StickerSearch:s?r.l.GifSearch:h?r.l.UserInfo:m?r.l.ChatInfo:void 0}function De(e){return void 0!==Ne(e)}function Fe(e){return e.globalSearch.query}function Le(e){return e.payment.messageId}function xe(e){return e.payment.formId}function Be(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function Re(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"n",(function(){return u})),n.d(t,"e",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"b",(function(){return c})),n.d(t,"i",(function(){return a})),n.d(t,"k",(function(){return i})),n.d(t,"f",(function(){return s})),n.d(t,"l",(function(){return f})),n.d(t,"c",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"h",(function(){return h})),n.d(t,"g",(function(){return m})),n.d(t,"a",(function(){return p})),n.d(t,"m",(function(){return g})),n.d(t,"o",(function(){return v}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),o="Mac OS"===u,d="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.Z||window.innerWidth<=r.Y&&window.innerHeight<=r.X,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(o||d)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p=window.devicePixelRatio||1,g=d;let y;function v(){return Boolean(y)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{y=e})},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...o)=>{u?(clearTimeout(u),u=void 0):n&&e(...o),u=self.setTimeout(()=>{r&&e(...o),u=void 0},t)}}function u(e,t,n=!0){let r,u,o;return(...d)=>{u=!0,o=d,r||(n&&(u=!1,e(...o)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...o)},t))}}function o(e){return a(h,e)}function d(e){return a(m,e)}function c(e){return a(i,e)}function a(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function i(e){Promise.resolve().then(e)}function s(e){self.requestIdleCallback?self.requestIdleCallback(e):i(e)}n.d(t,"a",(function(){return r})),n.d(t,"g",(function(){return u})),n.d(t,"i",(function(){return o})),n.d(t,"h",(function(){return d})),n.d(t,"j",(function(){return c})),n.d(t,"d",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"b",(function(){return h}));const f=e=>new Promise(t=>{setTimeout(()=>t(),e)});function l(){return new Promise(e=>{requestAnimationFrame(e)})}let b;function h(e,t=!1){b?t?b.unshift(e):b.push(e):(b=[e],requestAnimationFrame(()=>{const e=b;b=void 0,e.forEach(e=>e())}))}function m(e){return h(e,!0)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(71),u=n.n(r),o=n(1),d=n(22);let c;const a=new Map,i=new Map;function s(e,t=""){return c||(o.o&&console.log(">>> START LOAD WORKER"),c=new u.a,function(e){c.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(c)return b({type:"callMethod",name:e,args:t});o.o&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&c.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(d.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),c.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return y})),n.d(t,"c",(function(){return O})),n.d(t,"b",(function(){return C}));var r=n(1),u=n(13),o=n(10);var d=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(46);const b={en:c,es:a,it:i,pl:s,ru:f},h=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],m={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},p=new Map;let g;const{addCallback:y,removeCallback:v,runCallbacks:I}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let w;async function O(e,t){if(g&&e===w)return document.documentElement.lang=e,void(t&&t());const n=await async function(e){const t=await u.c(r.E,e,u.a.Json);if(t)return t;const n=await Object(o.a)("fetchLangPack",{sourceLangPacks:r.F,langCode:e});if(n)return await u.d(r.E,e,n.langPack),n.langPack;return}(e);if(n){if(b[e])try{const t=await fetch(b[e]),r=await t.json(),u=Object(d.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.o&&console.error(e)}p.clear(),w=e,g=n,document.documentElement.lang=e,t&&t(),I(g)}}function C(e,t,n){if(void 0!==t){const r=p.get(`${e}_${t}_${n}`);if(r)return r}if(!g)return e;const r=g[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=w&&m[w]?m[w](e):0;return h[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return p.set(`${e}_${t}_${n}`,r),r}return u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const o={},d={};async function c(e,t){if(!o[e]){switch(e){case u.Auth:o[u.Auth]=n.e(4).then(n.bind(null,93));break;case u.Main:r.o&&console.log(">>> START LOAD MAIN BUNDLE"),o[u.Main]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,92));break;case u.Extra:o[u.Extra]=Promise.all([n.e(0),n.e(2)]).then(n.bind(null,91))}o[e].then(f)}const c=await o[e];return d[e]||(d[e]=c),a(e,t)}function a(e,t){const n=d[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function o(e,t,n){if(!r)return;const o=new Request(t),d=await r.open(e),c=await d.match(o);if(c)switch(n){case u.Text:return c.text();case u.Blob:{const e=await c.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=c.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return c.json();default:return}}async function d(e,t,n){if(!r)return;const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),o=new Request(t),d=new Response(u);return(await r.open(e)).put(o,d)}function c(e){if(r)return r.delete(e)}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return c})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(9);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function o(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const o=new Uint8Array(u);for(;u--;)o[u]=r.charCodeAt(u);return new Blob([o],{type:n})}function d(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function c(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function o(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\u2624|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(20);n(83);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(12),o=n(29);t.a=(e,t,n=!1,d=!1)=>{const c=Object(u.c)(e,t),a=Object(o.a)();return d&&Object(u.b)(a),Object(r.n)(()=>{n||c||Object(u.d)(e,t).then(a)},[e,a,c,t,n]),c}},function(e,t,n){"use strict";let r,u,o,d,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersIncludedChats=28]="FoldersIncludedChats",e[e.FoldersExcludedChats=29]="FoldersExcludedChats",e[e.TwoFaDisabled=30]="TwoFaDisabled",e[e.TwoFaNewPassword=31]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=32]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=33]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=34]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=35]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=36]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=37]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=38]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=39]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=40]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=41]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=42]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=43]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=44]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=45]="TwoFaCongratulations"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(c||(c={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.Statistics=4]="Statistics",e[e.StickerSearch=5]="StickerSearch",e[e.GifSearch=6]="GifSearch",e[e.PollResults=7]="PollResults"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(p||(p={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"e",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return o}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var o="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function d(e){return o.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=o.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,o,d)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),o&&(a+=`${c}${o}`),d&&(a+=`${c}${d}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=c(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(79);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const o=Date.now();let d=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!d){if(Date.now()-o<=5e3){if(localStorage.getItem(r.A))localStorage.removeItem(r.A);else{if(!localStorage.getItem(r.C))return;localStorage.removeItem(r.C)}return d=!0,void window.location.reload()}0}}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"c",(function(){return c})),n.d(t,"d",(function(){return a})),n.d(t,"e",(function(){return i})),n.d(t,"h",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"g",(function(){return l})),n.d(t,"a",(function(){return b})),n.d(t,"b",(function(){return h}));var r=n(1),u=n(28),o=n(3);const d=[1,8,5,2,7,4,6];function c(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t){if(e.id===r.gb)return t("ServiceNotifications").toLowerCase();if(e.type&&"userTypeBot"===e.type)return"bot";if(!e.status)return"";switch(e.status.type){case"userStatusEmpty":return t("ALongTimeAgo");case"userStatusLastMonth":return t("WithinAMonth");case"userStatusLastWeek":return t("WithinAWeek");case"userStatusOffline":{const{wasOnline:n}=e.status;if(!n)return t("LastSeen.Offline");const r=new Date,o=new Date(1e3*n);if(o>=r)return t("LastSeen.JustNow");const d=new Date(r.getTime()-o.getTime());if(d.getTime()/1e3<60)return t("LastSeen.JustNow");if(d.getTime()/1e3<3600){return t("LastSeen.MinutesAgo",Math.floor(d.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),o>c){if(d.getTime()/1e3<21600){return t("LastSeen.HoursAgo",Math.floor(d.getTime()/1e3/60/60))}return t("LastSeen.TodayAt",Object(u.h)(o))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),o>a?t("LastSeen.YesterdayAt",Object(u.h)(o)):t("LastSeen.AtDate",Object(u.b)(o))}case"userStatusOnline":return t("Online");case"userStatusRecently":return t("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.gb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.gb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(o.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-n.indexOf(e);const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return d[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return a})),n.d(t,"v",(function(){return i})),n.d(t,"t",(function(){return s})),n.d(t,"y",(function(){return f})),n.d(t,"u",(function(){return l})),n.d(t,"z",(function(){return b})),n.d(t,"j",(function(){return h})),n.d(t,"p",(function(){return m})),n.d(t,"i",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"f",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"x",(function(){return I})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"A",(function(){return C})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return E})),n.d(t,"o",(function(){return S})),n.d(t,"h",(function(){return M})),n.d(t,"g",(function(){return A})),n.d(t,"s",(function(){return k})),n.d(t,"b",(function(){return T})),n.d(t,"C",(function(){return P})),n.d(t,"B",(function(){return N})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return L})),n.d(t,"n",(function(){return x}));var r=n(5),u=n(1),o=n(3),d=n(23),c=n(11);function a(e){return e>0}function i(e){return s(e)||f(e)}function s(e){return"chatTypeBasicGroup"===e.type}function f(e){return"chatTypeSuperGroup"===e.type}function l(e){return"chatTypeChannel"===e.type}function b(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function h(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function m(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function p(e,t){return t&&e.id===t.id&&t.isSelf?Object(c.b)("SavedMessages"):e.title||Object(c.b)("HiddenName")}function g(e){if(e.fullInfo)return e.fullInfo.about}function y(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function v(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function I(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function O(e,t){return!!e.adminRights&&e.adminRights[t]}function C(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!a(e.id)||(l(e)?O(e,"postMessages"):w(e)||!C(e,"sendMessages"))))}function E(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!C(e,"sendMedia"),canAttachPolls:(n||!C(e,"sendPolls"))&&(!a(e.id)||t),canSendStickers:n||!C(e,"sendStickers"),canSendGifs:n||!C(e,"sendGifs"),canAttachEmbedLinks:n||!C(e,"embedLinks")}}function S(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function M(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function A(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function k(e){return e.folderId===u.g}function T(e){return s(e)||(f(e)||l(e))&&e.isCreator}function P(e,t,n,r){const u=n.excludedChatIds?new Set(n.excludedChatIds):void 0,o=n.excludedChatIds?new Set(n.includedChatIds):void 0,d=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(r||Object.keys(e).map(Number)).filter(r=>function(e,t,n,r,u,o){if(r&&r.has(e.id))return!1;if(u&&u.has(e.id))return!0;if(o&&o.has(e.id))return!0;if(k(e)&&t.excludeArchived)return!1;if(e.isMuted&&t.excludeMuted)return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(a(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(i(e))return!!t.groups;if(l(e))return!!t.channels}return!1}(e[r],n,t,u,o,d)),n.pinnedChatIds]}function N(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(k(e))return!1;break;case"archived":if(!k(e))return!1}return!e.isRestricted&&!e.isNotJoined}const d=t.map(t=>e[t]).filter(u),c=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>c.has(e.id)):[],otherChats:Object(o.k)(n?d.filter(e=>!n.includes(e.id)):d,A,"desc")}}function D(e,t,n,r){const[u]=P(e,t,n,r),o=u.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:o.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:o.some(e=>e.unreadMentionsCount||!e.isMuted&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u){const{id:o,title:d,emoticon:c,description:a,pinnedChatIds:i,excludedChatIds:s,includedChatIds:f,excludeArchived:l,excludeMuted:b,excludeRead:h,...m}=n;if(Object.values(m).filter(Boolean).length>1||s&&s.length||f&&f.length){return u("Chats",function(e,t,n,r){const[u,o]=P(e,t,n,r),{pinnedChats:d,otherChats:c}=N(e,u,o,"folder");return d.length+c.length}(e,t,n,r))}return m.bots?u("FilterBots"):m.groups?u("FilterGroups"):m.channels?u("FilterChannels"):m.contacts?u("FilterContacts"):m.nonContacts?u("FilterNonContacts"):void 0}function L(e){return!!e&&e.id<0}function x(e,t){if(t&&!a(e))return t.isSelf?"You":Object(d.c)(t)}},function(e,t,n){"use strict";function r(e,t){const n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>e[n]===t[n])}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(1);const u=new Set(["scroll","mouseenter","mouseleave"]),o={},d=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){o[e]||(o[e]=new Map);return o[e]})(e).set(t,n),function(e){const t=d.get(e);if(t)return t;const n=new Set;return d.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),o[e].delete(t),d.get(t).delete(e)}function b(e){const t=d.get(e);t&&(t.forEach(t=>l(t,e)),d.delete(e))}function h(e){const t=o[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},o=()=>{e.preventDefault()},d=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?o:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(d),n))return;r=r.parentNode}}}r.o&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:o,delegatedEventsByElement:d,documentEventCounters:c})})},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=(e=!1,t,n=!1,o="fast",d=!1)=>{const[c,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(!1);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),c||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},d?0:350)));const l=s||e&&n,b=Boolean(i.current),h=e||b;return{shouldRender:h,transitionClassNames:Object(u.a)(o&&"opacity-transition",o,l&&"open",h&&"shown",b&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return a})),n.d(t,"k",(function(){return i})),n.d(t,"n",(function(){return s})),n.d(t,"h",(function(){return l})),n.d(t,"g",(function(){return b})),n.d(t,"b",(function(){return h})),n.d(t,"f",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"i",(function(){return I})),n.d(t,"a",(function(){return w})),n.d(t,"l",(function(){return C})),n.d(t,"m",(function(){return j}));var r=n(42),u=n(11);const o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],d=["January","February","March","April","May","June","July","August","September","October","November","December"],c=d.map(e=>e.toLowerCase());function a(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function i(e){return a(e).getTime()}function s(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function f(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function l(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function b(e){const t="number"==typeof e?new Date(e):e,n=a(new Date);if(t>=n)return l(t);const r=new Date(n);if(r.setDate(n.getDate()-7),t>=r)return Object(u.b)("Weekday.Short"+o[t.getDay()]);const d=t.getFullYear()!==n.getFullYear();return g(t,Object(u.b)(d?"formatDateScheduleYear":"formatDateSchedule")||(d?"d MMM yyyy":"d MMM"))}function h(e){return g("number"==typeof e?new Date(e):e,Object(u.b)("formatterYearMax")||"dd.MM.yyyy")}function m(e,t=!1){return g(e,Object(u.b)(t?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy")}function p(e,t=!1,n=!1){const r="number"==typeof e?new Date(e):e,d=a(new Date);if(!n){if(f(r)===f(d))return(t?E:S)(Object(u.b)("Weekday.Today"));const e=new Date(d);if(e.setDate(d.getDate()-1),f(r)===f(e))return(t?E:S)(Object(u.b)("Weekday.Yesterday"));const n=new Date(d),c=new Date(d);if(n.setDate(d.getDate()-7),c.setDate(d.getDate()+7),r>=n&&r<=c){const e=o[r.getDay()];return t?E(Object(u.b)("Weekday.Short"+e)):S(Object(u.b)("Weekday."+e))}}const c=r.getFullYear()!==d.getFullYear(),i=t?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate";return(t?E:S)(g(r,Object(u.b)(i)||"d MMMM yyyy"))}function g(e,t){const n=e.getDate(),r=e.getMonth();return t.replace("LLLL",Object(u.b)(d[r])).replace("MMMM",Object(u.b)("Month.Gen"+d[r])).replace("MMM",Object(u.b)("Month.Short"+d[r])).replace("MM",String(r+1).padStart(2,"0")).replace("dd",String(n).padStart(2,"0")).replace("d",String(n)).replace("yyyy",String(e.getFullYear()))}function y(e){const t="number"==typeof e?new Date(e):e;return`${p(t,!0)}, ${l(t)}`}function v(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function I(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const o=(e=Math.floor(e/60))%60;return o>0&&t.push(String(o).padStart(2,"0")),t.push(String(u).padStart(o>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function w(e){return e.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric"})}function O(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function C(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!O(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),o=t?u[0]:u[1],d=(t?u[1]:u[0]).toLowerCase(),a=c.findIndex(e=>e.startsWith(d));return-1!==a&&O(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function j(e){return e+r.j/1e3}function E(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function S(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return i}));var r=n(10),u=n(1),o=n(7);function d(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function c(){return!!o.j&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(u.o&&console.log("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(u.o&&console.log("[PUSH] Push messaging isn't supported."),!1):(u.o&&console.log("[PUSH] Push notifications aren't supported."),!1))}async function a(){if(!c)return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();if(t){u.o&&console.log("[PUSH] Unsubscribing",t);try{const e=d(t);await Object(r.a)("unregisterDevice",e),await t.unsubscribe()}catch(e){u.o&&console.log("[PUSH] Unable to unsubscribe from push.",e)}}}async function i(){if(!c())return;await a();const e=await navigator.serviceWorker.ready;try{const t=d(await e.pushManager.subscribe({userVisibleOnly:!0}));u.o&&console.log("[PUSH] Received push subscription: ",t),await Object(r.a)("registerDevice",t)}catch(e){"denied"===Notification.permission?u.o&&console.log("[PUSH] Permission for Notifications was denied"):u.o&&console.log("[PUSH] Unable to subscribe to push.",e)}}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#21212140"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code-own":["#3C7940","#FFFFFF"]}')},function(e,t,n){"use strict";var r=n(0),u=n(8),o=n(20),d=n(34);n(81);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:c,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:I,ariaLabel:w,href:O,download:C,disabled:j,ripple:E,faded:S,tabIndex:M})=>{let A=Object(r.q)(null);e&&(A=e);const[k,T]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",j&&"disabled",v&&"text",I&&"loading",E&&"has-ripple",S&&"faded",k&&"clicked"),N=Object(r.m)(e=>{!j&&n&&n(e),T(!0),setTimeout(()=>{T(!1)},400)},[j,n]),D=Object(r.m)(e=>{e.preventDefault(),!j&&a&&a(e)},[a,j]);return O?r.a.createElement("a",{ref:A,className:P,href:O,title:w,download:C,tabIndex:M},l,!j&&E&&r.a.createElement(d.a,null)):r.a.createElement("button",{ref:A,type:t,className:P,onClick:N,onContextMenu:c,onMouseDown:D,onMouseEnter:i&&!j?i:void 0,onMouseLeave:s&&!j?s:void 0,onFocus:f&&!j?f:void 0,"aria-label":w,title:w,tabIndex:M},I?r.a.createElement("div",null,r.a.createElement("span",null,"Please wait.."),r.a.createElement(o.a,{color:v?"blue":"white"})):l,!j&&E&&r.a.createElement(d.a,null))}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(86);t.a=e=>{const{icon:t,className:n,children:o,onClick:d,href:c,download:a,disabled:i,destructive:s,ariaLabel:f}=e,l=Object(r.m)(e=>{if(i||!d)return e.stopPropagation(),void e.preventDefault();d(e)},[i,d]),b=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return i||!d?(e.stopPropagation(),void e.preventDefault()):void d(e)},[i,d]),h=Object(u.a)("MenuItem",n,i&&"disabled",s&&"destructive"),m=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t}),o);return c?r.a.createElement("a",{tabIndex:0,className:h,href:c,download:a,"aria-label":f,title:f,target:"_blank",rel:"noopener noreferrer"},m):r.a.createElement("div",{role:"button",tabIndex:0,className:h,onClick:l,onKeyDown:b,"aria-label":f,title:f},m)}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(80);t.a=()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),o=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,o=u.getBoundingClientRect(),d=u.offsetWidth/2;t([...e,{x:r.clientX-o.x-d/2,y:r.clientY-o.y-d/2,size:d}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:o},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(74),u=n.n(r),o=n(7),d=n(14),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(o.o)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(d.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(d.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(15),o=n(1),d=n(7),c=n(68),a=n(8),i=n(69),s=n(52);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return o=e,d=n.highlight,o.reduce((e,t)=>{if("string"!=typeof t||!d)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(d.toLowerCase()),o=n[u+d.length];if(u<0||o&&o.match(f))return[...e,t];const c=[];return c.push(t.substring(0,u)),c.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+d.length))),c.push(t.substring(u+d.length)),[...e,...c]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=[...t.match(p)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let o=n.shift(),d=0;for(;o;){const e=t.indexOf(o,d);u.push(t.substring(d,e)),o.startsWith("@")?u.push(r.a.createElement(i.a,{username:o},o)):u.push(r.a.createElement(s.a,{text:o,url:o})),d=e+o.length,o=n.shift()}return u.push(t.substring(d)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var o,d;return e},[e])}function h(e,t,n){return d.c?e:e.reduce((e,o)=>{if("string"!=typeof o)return[...e,o];const d=o.split(u.a),i=o.match(u.a)||[];return e.push(d[0]),i.reduce((e,o,i)=>{const s=Object(c.a)(Object(u.b)(o)),f=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.a.createElement("img",{className:f,src:`./img-apple-${"big"===t?"160":"64"}/${s}.png`,alt:o})),"html"===n&&e.push(`${o}`);const l=2*i+2;return d[l]&&e.push(d[l]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,o)=>{const d=n.trimLeft(),c=n.length-d.length;return e.push(String.fromCharCode(160).repeat(c)+d),u!==o.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(o.ab,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),o=n.match(l)||[];return e.push(u[0]),o.reduce((e,n,o)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const d=2*o+2;return u[d]&&e.push(u[d]),e},e)},[])}},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"q",(function(){return o})),n.d(t,"G",(function(){return d})),n.d(t,"r",(function(){return c})),n.d(t,"F",(function(){return a})),n.d(t,"K",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"I",(function(){return f})),n.d(t,"H",(function(){return l})),n.d(t,"L",(function(){return m})),n.d(t,"v",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return I})),n.d(t,"J",(function(){return w})),n.d(t,"cb",(function(){return O})),n.d(t,"i",(function(){return C})),n.d(t,"j",(function(){return j})),n.d(t,"T",(function(){return E})),n.d(t,"bb",(function(){return S})),n.d(t,"f",(function(){return A})),n.d(t,"x",(function(){return k})),n.d(t,"ib",(function(){return T})),n.d(t,"jb",(function(){return P})),n.d(t,"t",(function(){return N})),n.d(t,"N",(function(){return D})),n.d(t,"M",(function(){return F})),n.d(t,"l",(function(){return L})),n.d(t,"E",(function(){return x})),n.d(t,"m",(function(){return B})),n.d(t,"gb",(function(){return R})),n.d(t,"fb",(function(){return U})),n.d(t,"O",(function(){return _})),n.d(t,"p",(function(){return G})),n.d(t,"hb",(function(){return $})),n.d(t,"n",(function(){return W})),n.d(t,"w",(function(){return z})),n.d(t,"lb",(function(){return K})),n.d(t,"mb",(function(){return V})),n.d(t,"e",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"k",(function(){return Y})),n.d(t,"P",(function(){return Z})),n.d(t,"Q",(function(){return X})),n.d(t,"S",(function(){return ee})),n.d(t,"R",(function(){return te})),n.d(t,"W",(function(){return ue})),n.d(t,"s",(function(){return oe})),n.d(t,"X",(function(){return de})),n.d(t,"V",(function(){return ae})),n.d(t,"U",(function(){return ie})),n.d(t,"Z",(function(){return fe})),n.d(t,"Y",(function(){return le})),n.d(t,"u",(function(){return be})),n.d(t,"ab",(function(){return he})),n.d(t,"a",(function(){return me})),n.d(t,"o",(function(){return pe})),n.d(t,"kb",(function(){return ge})),n.d(t,"eb",(function(){return ye})),n.d(t,"C",(function(){return ve})),n.d(t,"A",(function(){return Ie})),n.d(t,"y",(function(){return we})),n.d(t,"D",(function(){return Oe})),n.d(t,"z",(function(){return Ce})),n.d(t,"B",(function(){return je})),n.d(t,"g",(function(){return Ee})),n.d(t,"h",(function(){return Se}));var r=n(1),u=n(3);function o(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function d(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:o(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n){const{byId:r}=e.chats,o=r[t],d=n.isMin&&o&&!o.isMin,a={...o,...d?Object(u.j)(n,["isMin","accessHash"]):n};return a.id&&a.type?c(e,{...r,[t]:a}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.g?"archived":"active";let o=e.chats.listIds;return Object.keys(o).forEach(e=>{const n=o[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(o={...o,[e]:n.filter(e=>e!==t)}):o={...o,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:o}},t,{folderId:n||void 0})}function l(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=I(e,t,n[t])}),e}function I(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(h.m)(e,t)||{},o={...u[n],...r};return o.id?p(e,t,{...u,[n]:o}):e}function O(e,t,n,r){const u=Object(h.nb)(e,t)||{},o={...u[n],...r};return o.id?N(e,t,{...u,[n]:o},void 0):e}function C(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const o=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost),d=Object(u.j)(r,n);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{let u=Object(h.X)(e,t,r),o=Object(h.db)(e,t,r),d=Object(h.Eb)(e,t,r),c=Object(h.gb)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",o),e=y(e,t,r,"viewportIds",d),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:o,fromMessageId:d}=n.forwardInfo,c=Object(h.k)(e,o,d);r&&u===d&&(e=m(e,t)),c&&(e=w(e,o,d,{threadInfo:void 0}))})}return e=p(e,t,d)}function j(e,t,n){const r=Object(h.nb)(e,t);if(!r)return e;const o=Object(u.j)(r,n);let d=Object(h.lb)(e,t);return d&&(n.forEach(e=>{d.includes(e)&&(d=d.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",d)),e=N(e,t,o,void 0)}function E(e,t,n,r){const u=Object(h.X)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:y(e,t,n,"listedIds",M([...u||[],...o]))}function S(e,t,n,r){const u=Object(h.db)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:y(e,t,n,"outlyingIds",M([...u||[],...o]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const o=Object(h.Eb)(e,t,n)||[];if(o.includes(u))return e;return y(e,t,n,"viewportIds",M([...o.length{e=T(e,t.chatId,t.threadId,t)}),e}function N(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function F(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function L(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function x(e,t,n,r,o,d,c,a=!1){const{selectedMessages:i}=e;d&&(c=Object(h.Z)(e,t,d));const s=c||[o];if(!i)return L(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const d=Object(h.x)(e,t,n,r),c=d.indexOf(f[f.length-1]),a=d.indexOf(o),i=Math.min(c,a),s=Math.max(c,a),b=d.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:B(e)}function B(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,o){const d=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(d,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map(({id:e})=>e)}}}}}function U(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function _(e,t,n,r){const{results:u}=e.gifs.search;let o;if(t||!u)o=n;else{const e=new Set(u.map(e=>e.id));o=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:o}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const o=[...Object(h.vb)(e,t),...n||[]],d=Object(u.o)(o.map(({id:e})=>e)),c=Object(u.c)(o,"id"),a=d.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var H=n(45);function z(e,t){return{...e,users:{...e.users,byId:t}}}function K(e,t,n){const{byId:r}=e.users,{hash:o,userIds:d}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&d&&!d.includes(t)&&(e={...e,contactList:{hash:o||0,userIds:[t,...d]}}),z(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=K(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=K(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],z(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):H.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,o){const{resultsByType:d}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=d&&d[r]?d[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],isActive:r,query:u})}function oe(e,t,n,r,u,o){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],results:{foundIds:r,totalCount:u,nextOffsetId:o}})}function de(e,t,n,r,o,d){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return oe(e,t,n,Object(u.a)(i,s)?i:s,o,d)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,o,d){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,o){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:o}}})}(e,t,n,Object(u.a)(a,i)?a:i,o,d)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function me(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function pe(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ge(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function ye(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function ve(e,t){return{...e,payment:{...e.payment,formId:t}}}function Ie(e,t){return{...e,payment:{...e.payment,step:t}}}function we(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:o}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:o}}}}function Oe(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ce(e,t){return{...e,payment:{...e.payment,...t}}}function je(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:o,title:d}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:o,title:d}}}}function Ee(e){return{...e,payment:{}}}function Se(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=Object(r.h)(({ref:e,id:t,className:n,value:o,label:d,error:c,success:a,disabled:i,readOnly:s,placeholder:f,autoComplete:l,inputMode:b,maxLength:h,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v})=>{const I=c||a||d,w=Object(u.a)("input-group",o&&"touched",c?"error":a&&"success",i&&"disabled",s&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:w},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,value:o||"",placeholder:f,maxLength:h,autoComplete:l,inputMode:b,disabled:i,readOnly:s,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),o=n(20);n(82);t.a=Object(r.h)(({id:e,name:t,value:n,label:d,subLabel:c,checked:a,disabled:i,round:s,blocking:f,isLoading:l,onChange:b,onCheck:h})=>{const m=Object(r.m)(e=>{b&&b(e),h&&h(e.currentTarget.checked)},[b,h]),p=Object(u.a)("Checkbox",i&&"disabled",s&&"round",l&&"loading",f&&"blocking");return r.a.createElement("label",{className:p},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:a,disabled:i,onChange:m}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label"},d),c&&r.a.createElement("span",{className:"subLabel"},c)),l&&r.a.createElement(o.a,null))})},function(e,t,n){"use strict";n.d(t,"g",(function(){return r})),n.d(t,"f",(function(){return u})),n.d(t,"B",(function(){return o})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"v",(function(){return i})),n.d(t,"s",(function(){return s})),n.d(t,"t",(function(){return f})),n.d(t,"u",(function(){return l})),n.d(t,"q",(function(){return b})),n.d(t,"e",(function(){return h})),n.d(t,"b",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return g})),n.d(t,"E",(function(){return y})),n.d(t,"F",(function(){return v})),n.d(t,"G",(function(){return I})),n.d(t,"l",(function(){return w})),n.d(t,"n",(function(){return O})),n.d(t,"m",(function(){return C})),n.d(t,"k",(function(){return j})),n.d(t,"o",(function(){return E})),n.d(t,"J",(function(){return S})),n.d(t,"H",(function(){return M})),n.d(t,"I",(function(){return A})),n.d(t,"p",(function(){return k})),n.d(t,"C",(function(){return T})),n.d(t,"D",(function(){return P})),n.d(t,"j",(function(){return N})),n.d(t,"A",(function(){return D})),n.d(t,"z",(function(){return F})),n.d(t,"x",(function(){return L})),n.d(t,"y",(function(){return x})),n.d(t,"w",(function(){return B})),n.d(t,"a",(function(){return R}));const r=window.devicePixelRatio||1,u={begin:.8,end:1},o=300,d=500,c=10,a=320,i=15,s=2,f=.45,l=10,b=.5,h=20,m="300 10px Helvetica, Arial, sans-serif",p=45,g=50,y=30,v=1,I=.1,w=40,O=10,C=1,j=8,E=4,S=o,M=.1,A=.5,k=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],T=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],P=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],N=864e5,D=200,F=4,L=1e3,x=1,B=.5,R=["begin 200 fast","end 200 fast","labelFromIndex 200 fast floor","labelToIndex 200 fast ceil","xAxisScale 400","yMinViewport","yMaxViewport","yMinViewportSecond","yMaxViewportSecond","yMinMinimap","yMaxMinimap","yMinMinimapSecond","yMaxMinimapSecond","yAxisScale","yAxisScaleSecond"]},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(51);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var r=n(0);let u,o=!1;const d=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),o=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{o=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(o&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,e])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function o(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function d(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return d}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";var r=n(0),u=n(27),o=n(70),d=n(53),c=n(43),a=n(8),i=n(44);n(84);t.a=({ref:e,containerRef:t,isOpen:n,className:s,style:f,children:l,positionX:b="left",positionY:h="top",autoClose:m=!1,footer:p,noCloseOnBackdrop:g=!1,onCloseAnimationEnd:y,onClose:v,onMouseEnter:I,onMouseLeave:w})=>{let O=Object(r.q)(null);e&&(O=e);const C=t||O,{transitionClassNames:j}=Object(u.a)(n,y);Object(r.n)(()=>n&&v?Object(c.a)(v):void 0,[n,v]),Object(d.a)(([e])=>{void 0!==e&&Object(i.b)(200)},[n]);const E=((e,t,n)=>{const[u,o]=Object(r.r)(-1);Object(r.n)(()=>{o(-1)},[t]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n();if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,c=Array.from(r.children);let a=d&&c.indexOf(d)||u;if(38===t.keyCode&&a>0)a--;else if(40===t.keyCode&&a{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(35);const m={[r.ApiMediaFormat.DataUri]:d.a.Text,[r.ApiMediaFormat.BlobUrl]:d.a.Blob,[r.ApiMediaFormat.Lottie]:d.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.h?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.K){const n=e.startsWith("avatar")?u.M:u.L,r=await d.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.g||(t=await b(t)),"image/webp"===r.type&&!Object(a.o)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=w(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let d=!1;return r.addEventListener("sourceopen",()=>{if(d)return;d=!0;const u=r.addSourceBuffer("audio/mpeg");Object(o.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(o.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.g){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=w(t),f=e.type}if("image/webp"===f&&!Object(a.o)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=w(n),f=t.type)}return p.set(e,s),s}(e,t,n).catch(e=>{u.o&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function I(e){Object(o.b)(e)}function w(e){return e instanceof Blob?URL.createObjectURL(e):e}a.h&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const d=await Object(o.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!d)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=d;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(9);let u=o();function o(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}const d=Object(r.g)(()=>{u=o()},250,!0);window.addEventListener("resize",d),window.addEventListener("orientationchange",d),t.a={get:()=>u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onTab:[]};function o(e){return d()||document.addEventListener("keydown",c,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),d()||document.removeEventListener("keydown",c,!1)}(e)}}function d(){return Object.values(u).some(e=>Boolean(e.length))}function c(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";var r=n(0),u=n(2);const o=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function d(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function c(e,t){const n=[],r=[],u=e.length;let c,a,i,s,f,l,b,h,m,p,g,y,v;for(c=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(I=e.charCodeAt(b++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=d(i-h,a,0===h),Math.floor(i/a)>2147483647-c)throw RangeError("punycode_overflow(3)");c+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,c),i++}var I;if(t)for(i=0,v=n.length;iObject(s.l)(t,["openTelegramLink"]))(({url:e,text:t,className:n,children:u,openTelegramLink:o})=>{const d=Object(r.m)(t=>!(!(t.ctrlKey||t.altKey||t.shiftKey||t.metaKey)&&e&&(e.match(i.cb)||e.match(i.bb)))||(t.preventDefault(),o({url:e}),!1),[o,e]);if(!e)return;const c=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:c,onClick:d},u||t)}))},function(e,t,n){"use strict";var r=n(0),u=n(38);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return c}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return o(t,n)}function o(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function d(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function c(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:o,fieldError:d,description:c}=u?r[u]:r[n];return{field:o,fieldError:d,description:c||t}}const o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function d(e){return Object.values(e).reduce((e,t)=>{const n=o[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return d}));var r=n(9);let u;function o(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&o(e,t)})}function d(e){Object(r.b)(()=>{e()&&d(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(48);n(85);t.a=({trigger:e,className:t,children:n,positionX:o="left",positionY:d="top",footer:c})=>{const a=Object(r.q)(null),i=Object(r.q)(null),[s,f]=Object(r.r)(!1);return r.a.createElement("div",{ref:i,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=a.current;if(!s||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{f(!s)},isOpen:s}),r.a.createElement(u.a,{ref:a,containerRef:i,isOpen:s,className:t||"",positionX:o,positionY:d,footer:c,autoClose:!0,onClose:()=>{f(!1)}},n))}},function(e,t,n){"use strict";var r=n(0),u=n(22),o=n(1),d=n(26);const c=new Set(["key","ref","teactFastList","teactOrderKey"]),a={autoPlay:"autoplay",autoComplete:"autocomplete"},i={};function s(e,t,n,u,d,{skipComponentUpdate:c=!1,forceIndex:a=!1,fragment:i,moveDirection:g}={}){if(!c&&t&&n&&Object(r.d)(t)&&Object(r.d)(n)&&!Object(r.c)(t,n)&&(n=function(e,t){return e.componentInstance.props=t.componentInstance.props,Object(r.j)(e.componentInstance)}(t,n)),!c&&n&&Object(r.d)(n)&&n.componentInstance.isMounted&&l(n,u,d,e),t===n)return n;if(!t&&n){Object(r.d)(n)&&(n=f(n,u,d,e));const t=b(n);Object(r.k)(n,t),a&&e.childNodes[d]?e.insertBefore(t,e.childNodes[d]):(i||e).appendChild(t)}else if(t&&!n)e.removeChild(Object(r.b)(t)),Object(r.l)(t);else if(t&&n)if(Object(r.c)(t,n)){Object(r.d)(n)&&(n=f(n,u,d,e));const o=b(n);Object(r.k)(n,o),e.replaceChild(o,Object(r.b)(t)),Object(r.l)(t)}else{const u=Object(r.d)(t)&&Object(r.d)(n);if(u||Object(r.k)(n,Object(r.b)(t)),Object(r.f)(t)&&Object(r.f)(n)){if(g){const n=Object(r.b)(t),u=e.childNodes["up"===g?d:d+1];u?e.insertBefore(n,u):(i||e).appendChild(n)}u||function(e,t,n){const r=Object.keys(e.props),u=Object.keys(t.props);r.forEach(r=>{void 0!==e.props[r]&&void 0===t.props[r]&&p(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?m(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(p(e,t,n),m(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return o.o&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let d=0;const c=e.children.reduce((e,r,o)=>{let c="props"in r?r.props.key:void 0;if(c&&!u.has(c))return s(n,r,void 0,t,-1),e;if(!c){const u=t.children[o],d=u&&"props"in u?u.props.key:void 0;if(!u||d)return s(n,r,void 0,t,-1),e;c="__indexKey#"+o}return e[c]={$element:r,index:d++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,f=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,o=c[u];if(!o)return a||(a=[],i=r),void a.push(e);a&&(f=f.concat(h(a,i,n,t)),i=void 0,a=void 0);const d="props"in e?e.props.teactOrderKey:void 0,b=o.index!==l&&o.order!==d,m=b&&l>o.index;b&&!m||l++,f.push(s(n,o.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:m?"down":"up"}}))}),a&&(f=f.concat(h(a,i,n,t)));return f}(e,t,n);const u=Math.max(e.children.length,t.children.length),d=[],c=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:c}:void 0);u&&d.push(u)}c&&n.appendChild(c);return d}(t,n,u?e:Object(r.b)(t))}}return n}function f(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:o}=e;if(!o.isMounted){l(e=Object(r.i)(o),t,n,u);const d=e.children[0];Object(r.d)(d)&&(e.children=[f(d,e,0,u)]),o.isMounted=!0}return e}function l(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=s(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function b(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return b(e.children[0]);const{tag:t,props:n,children:u=[]}=e,o=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=o),Object.keys(n).forEach(e=>{m(o,e,n[e])}),e.children=u.map((t,n)=>s(o,void 0,t,e,n)),o}function h(e,t,n,r){if(1===e.length)return[s(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),o=e.map(e=>s(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),o}throw new Error("Unexpected input")}function m(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(d.a)(e,t,n):t.startsWith("data-")?e.setAttribute(t,n):c.has(t)||(e[a[t]||t]=n))}function p(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(d.c)(e,t,n):t.startsWith("data-")?e.removeAttribute(t):c.has(t)||delete e[a[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(i),i[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=i[n];r.children=[s(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";var r=n(15);const u=new RegExp(`^(?:${r.a.source})+$`,"");t.a=e=>{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return o})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,o="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(56),u=n(31);let o=!1;const d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,c=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=d.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const o=Math.round(c(u[e].r,u[t].r,n)),d=Math.round(c(u[e].g,u[t].g,n)),a=Math.round(c(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(c(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${o},${d},${a},${i/255})`:`rgb(${o},${d},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=o&&t,d=n?0:1,c=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),o&&document.documentElement.classList.add("disable-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("disable-animations")},500),o=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(d,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(d,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return d}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function o(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function d(e){const t={categories:[],emojis:{}};for(let n=0;n({userOrChat:t?Object(d.Db)(e,t):void 0}),(e,t)=>Object(o.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:o})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&o({username:e.substring(1)})},className:"text-entity-link"},n))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"780771c8627efba795b7.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),o=n(11),d=n(67);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(o.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.k?"is-touch-env":"is-pointer-env"),Object(d.a)(t,n>0),u.i&&document.body.classList.add("is-safari"),u.d?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0}))},function(e,t,n){"use strict";var r=n(2),u=n(1),o=n(10),d=n(30);Object(r.b)("initApi",(e,t)=>{const n=localStorage.getItem(u.C)||void 0;return Object(o.c)(t.apiUpdate,n),{...e,authIsSessionRemembered:Boolean(n)}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(o.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(o.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(o.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(o.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(o.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(o.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(o.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionId:r}=n;localStorage.setItem(u.C,r)}),Object(r.b)("signOut",()=>{!async function(){await Object(d.b)(),await Object(o.a)("destroy"),localStorage.removeItem(u.C),Object(r.d)().init()}()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(o.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()})},function(e,t,n){"use strict";var r=n(2),u=n(1),o=n(30),d=n(39),c=n(11);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.o&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(o.a)(),Object(c.c)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":{if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()});const{sessionId:u}=e;u&&t.authRememberMe&&Object(r.d)().saveSession({sessionId:u});break}}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?Object(r.d)().sync():"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(d.lb)(Object(r.e)(),t.id,t),currentUserId:t.id})}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(21),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(1),o=n(2),d=n(7);d.j&&window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.o&&console.log("ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?u.o&&console.log("ServiceWorker ready"):(u.o&&console.error("ServiceWorker not available"),Object(o.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.o&&console.error("ServiceWorker registration failed: ",e)}});var c=n(58);const a={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{}},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.r,isBackgroundBlurred:!0,patternColor:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},privacy:{}},twoFaSettings:{}};var i=n(5),s=n(9),f=n(3),l=n(6);const b=Object(s.g)((function(){Object(s.c)(()=>{const e=Object(o.e)();if(e.isLoggingOut)return;const t={...a,...Object(f.l)(e,["authState","authPhoneNumber","authRememberMe","authIsSessionRemembered","authNearestCountry","currentUserId","contactList","chatFolders","topPeers","recentEmojis"]),isChatInfoShown:m(e),users:p(e),chats:g(e),messages:y(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:v(e)},n=JSON.stringify(t);localStorage.setItem(u.A,n)})}),1e3,!1);function h(e){if(!u.z){if(localStorage.getItem(u.C))return Object(o.a)(b),function(e){u.o&&console.time("global-state-cache-read");const t=localStorage.getItem(u.A),n=t?JSON.parse(t):void 0;u.o&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey});return{...e,...n}}(e)}}function m(e){return window.innerWidth>u.W&&e.isChatInfoShown}function p(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.y).filter(e=>e>0),...Object.keys(t)].slice(0,u.B);return{byId:Object(f.l)(t,r),selectedId:window.innerWidth>u.W?n:void 0}}function g(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.y)],{chatId:n}=Object(l.y)(e)||{};return{...e.chats,byId:Object(f.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function y(e){const t={},{chatId:n}=Object(l.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.y),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[i.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(f.l)(r.byId,u.viewportIds),threadsById:{[i.MAIN_THREAD_ID]:u}})});const r=Object(l.y)(e);return{byChatId:t,messageLists:!r||d.f?void 0:[{...r,threadId:i.MAIN_THREAD_ID,type:"thread"}]}}function v(e){const{byKey:t}=e.settings;return{byKey:t,privacy:{}}}u.z||(Object(o.b)("saveSession",()=>{Object(o.a)(b)}),Object(o.b)("signOut",()=>{Object(o.f)(b),localStorage.removeItem(u.A)})),Object(o.b)("init",()=>{const e=Object(f.d)(a),t=h(e)||e,n=Object(l.y)(t)||{};return window.history.replaceState(n,""),t});var I=n(0),w=n(50),O=(n(75),n(76),n(77),n(24)),C=n(37),j=n(27),E=n(14);const S=["400 1em Roboto","500 1em Roboto"];function M(){if("fonts"in document)return Promise.all(S.map(e=>document.fonts.load(e)))}var A=n(49),k=n(12),T=n(8),P=(n(78),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),N=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function D(){const{listIds:e,byId:t}=Object(o.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(O.d)(n);return r?A.b(r,i.ApiMediaFormat.DataUri):void 0}))}const F={main:()=>Promise.all([Object(k.d)(k.a.Main,"Main").then(M),D()]),authPhoneNumber:()=>Promise.all([M(),Object(E.g)(P)]),authCode:()=>Object(E.g)(N),authPassword:()=>Object(E.g)(N),authQrCode:M};var L=Object(o.h)(e=>({uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(e.settings.byKey.customBackground),isCustomBackgroundColor:Boolean((e.settings.byKey.customBackground||"").match(/^#[a-f\d]{6,8}$/i)),isRightColumnShown:Object(l.V)(e)}),(e,t)=>Object(f.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,isCustomBackgroundColor:r,isRightColumnShown:u,setIsUiReady:o})=>{const[d,c]=Object(C.a)(),{shouldRender:a,transitionClassNames:i}=Object(j.a)(!d,void 0,!0);return Object(I.n)(()=>{let t;return Promise.race([Object(s.e)(700),F[e]()]).then(()=>{c(),o({uiReadyState:1}),t=window.setTimeout(()=>{o({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),o({uiReadyState:0})}},[]),I.a.createElement("div",{id:"UiLoader"},t,a&&I.a.createElement("div",{className:Object(T.a)("mask",i)},"main"===e?I.a.createElement(I.a.Fragment,null,I.a.createElement("div",{className:"left"}),I.a.createElement("div",{className:Object(T.a)("middle",n&&!r&&"custom-bg-image",n&&r&&"custom-bg-color",u&&"with-right-column")}),u&&I.a.createElement("div",{className:"right"})):I.a.createElement("div",{className:"blank"})))}),x=n(13),B=n(19),R=n(32),U=n(41),_=n(40),G=n(16),$=n(47),W=n(36),H=n(57),z=n(33),K=n(20);n(87);const V=200+u.c;var q=Object(I.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(I.q)(null),[o,d]=Object(I.r)(),[c,a]=Object(I.r)(B.a);function i(e){d(e),a(function(e=""){return e.length?B.a.filter(t=>Object($.a)(t.name,e)):B.a}(e))}const s=Object(I.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=B.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),V)},[r]),f=Object(I.m)(e=>{i(e.currentTarget.value)},[]),l=Object(I.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===o&&(n.value=""),i(n.value)},[o,t]);return I.a.createElement(H.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:d})=>{const c=()=>{if(d)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==o?o:t&&t.name||"";return I.a.createElement("div",{className:Object(T.a)("input-group",t&&"touched")},I.a.createElement("input",{ref:u,className:Object(T.a)("form-control",d&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),I.a.createElement("label",null,"Country"),n?I.a.createElement(K.a,{color:"black"}):I.a.createElement("i",{onClick:c,className:Object(T.a)("css-icon-down",d&&"open")}))}},c.map(e=>I.a.createElement(z.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},I.a.createElement("span",{"data-country-id":e.id}),I.a.createElement("span",{className:"country-flag"},Object(W.a)(e.flag,["hq_emoji"])),I.a.createElement("span",{className:"country-name"},e.name),I.a.createElement("span",{className:"country-code"},e.code))),!c.length&&I.a.createElement(z.a,{key:"no-results",className:"no-results",disabled:!0},I.a.createElement("span",null,"No countries matched your filter.")))});let J=!1;var Y=Object(I.h)(Object(o.h)(e=>Object(f.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(f.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:o,authError:c,authRememberMe:a,authNearestCountry:i,setAuthPhoneNumber:s,setAuthRememberMe:f,loadNearestCountry:l,clearAuthError:b,gotToAuthQrCode:h})=>{const m=Object(I.q)(null),[p,g]=Object(I.r)(),[y,v]=Object(I.r)(),[w,O]=Object(I.r)(!1),[C,j]=Object(I.r)(),S=p?`${p.code} ${y||""}`:y,A=S&&S.replace(/[^\d]+/g,"").length>=10;Object(I.n)(()=>{d.k||m.current.focus()},[p]),Object(I.n)(()=>{"connectionStateReady"!==e||i||l()},[e,i,l]),Object(I.n)(()=>{!i||p||w||g(Object(B.d)(i))},[p,i,w]);const k=Object(I.m)(e=>{const t=Object(B.e)(e),n=!p||t&&t.id!==p.id?t:p;e.length?(!p||n&&n.code!==p.code)&&g(n):g(void 0),v(Object(B.b)(e,n))},[p]);Object(I.n)(()=>{void 0===y&&n&&k(n)},[n,y,k]),Object(I.o)(()=>{m.current&&C&&m.current.setSelectionRange(...C)},[C]),Object(I.n)(()=>{setTimeout(()=>{x.b(u.L),x.b(u.M),x.b(u.N),x.b(u.l),x.b(u.E)},2e3)},[]);const T=Object(I.m)(e=>{c&&b(),J||(J=!0,M(),Object(E.g)(N));const{value:t,selectionStart:n,selectionEnd:r}=e.target;j(n&&r&&r{f(e.target.checked)},[f]);const D="authorizationStateWaitPhoneNumber"===t;return I.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},I.a.createElement("div",{className:"auth-form"},I.a.createElement("div",{id:"logo"}),I.a.createElement("h2",null,"Sign in to Telegram"),I.a.createElement("p",{className:"note"},"Please confirm your country and",I.a.createElement("br",null),"enter your phone number."),I.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||A&&s({phoneNumber:S})}},I.a.createElement(q,{id:"sign-in-phone-code",value:p,isLoading:!i&&!p,onChange:g}),I.a.createElement(_.a,{ref:m,id:"sign-in-phone-number",label:"Phone Number",value:S,error:c,inputMode:"tel",onChange:T}),I.a.createElement(U.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(a),onChange:P}),A&&(D?I.a.createElement(R.a,{type:"submit",ripple:!0,isLoading:r},"Next"):I.a.createElement(G.a,null)),D&&I.a.createElement(R.a,{isText:!0,ripple:!0,isLoading:o,onClick:h},"Log in by QR code"))))})),Q=n(17);var Z=()=>{const e=Object(Q.a)(k.a.Auth,"AuthCode");return e?I.a.createElement(e,null):I.a.createElement(G.a,null)};var X=()=>{const e=Object(Q.a)(k.a.Auth,"AuthPassword");return e?I.a.createElement(e,null):I.a.createElement(G.a,null)};var ee=()=>{const e=Object(Q.a)(k.a.Auth,"AuthRegister");return e?I.a.createElement(e,null):I.a.createElement(G.a,null)};var te=()=>{const e=Object(Q.a)(k.a.Auth,"AuthQrCode");return e?I.a.createElement(e,null):I.a.createElement(G.a,null)};n(88);var ne=Object(I.h)(Object(o.h)(e=>Object(f.l)(e,["authState"]),(e,t)=>Object(f.l)(t,["initApi"]))(({authState:e,initApi:t})=>{switch(Object(I.n)(()=>{t()},[t]),e){case"authorizationStateWaitCode":return I.a.createElement(L,{page:"authCode",key:"authCode"},I.a.createElement(Z,null));case"authorizationStateWaitPassword":return I.a.createElement(L,{page:"authPassword",key:"authPassword"},I.a.createElement(X,null));case"authorizationStateWaitRegistration":return I.a.createElement(ee,null);case"authorizationStateWaitQrCode":return I.a.createElement(L,{page:"authQrCode",key:"authQrCode"},I.a.createElement(te,null));case"authorizationStateWaitPhoneNumber":default:return I.a.createElement(L,{page:"authPhoneNumber",key:"authPhoneNumber"},I.a.createElement(Y,null))}}));var re=()=>{const e=Object(Q.a)(k.a.Main,"Main");return e?I.a.createElement(e,null):void 0};function ue(){return o.c.createElement(L,{page:"main",key:"main"},o.c.createElement(re,null))}var oe=Object(o.h)(e=>Object(f.l)(e,["authState","authIsSessionRemembered"]))(({authState:e,authIsSessionRemembered:t})=>{if(Object(I.n)(()=>{Object(w.b)()},[]),e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return o.c.createElement(ne,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return ue()}return t?ue():o.c.createElement(ne,null)});n(89);u.o&&console.log(">>> INIT"),Object(o.d)().init(),u.o&&console.log(">>> START INITIAL RENDER"),c.a.render(o.c.createElement(oe,null),document.getElementById("root")),u.o&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(o.e)())})}]); +//# sourceMappingURL=main.3ac509d3ed06c3cff5da.js.map \ No newline at end of file diff --git a/dist/main.3ac509d3ed06c3cff5da.js.map b/dist/main.3ac509d3ed06c3cff5da.js.map new file mode 100644 index 000000000..378deca12 --- /dev/null +++ b/dist/main.3ac509d3ed06c3cff5da.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/types/index.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/types/index.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/util/pushNotifications.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/lib/lovely-chart/constants.js","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/emoji.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","1","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","getTarget","setTarget","useState","initial","newValue","scheduleNextState","throttleWithPrimaryRaf","applyNextState","throttleWithRaf","currentElement","forceUpdateComponent","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","propsRef","renderedRef","addEventListener","orderBy","values","APP_INFO","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","Set","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","LAYERS_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","getUnequalProps","join","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","id","generateIdFor","useForceUpdate","delete","set","currentProps","newProps","currentKeys","filter","prop","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","caption","title","performer","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","isChatSuperGroup","onlineCount","fullInfo","members","memberId","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","isMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","selectFirstUnreadId","outlyingIds","lastReadId","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","settings","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","isStatisticsShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","Statistics","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","DPR","devicePixelRatio","MASK_IMAGE_ENABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","throttleWithTickEnd","waiting","onIdle","requestIdleCallback","pause","rafPromise","requestAnimationFrame","fastRafCallbacks","isPrimary","unshift","currentCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionId","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","cache","langPack","runCallbacks","createCallbackManager","currentLangCode","async","setLanguage","langCode","lang","newLangPack","cached","cacheApi","Json","remote","sourceLangPacks","fetchFromCacheOrRemote","fetch","pairs","json","extraLangPack","clear","getTranslation","format","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","caches","Type","cacheName","Request","open","Blob","blob","substr","headers","save","cacheData","JSON","stringify","Response","put","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","canvas","videoWidth","videoHeight","getContext","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","store","random","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","getSortedUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","isNotJoined","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","privateChatUser","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","filters","pinnedIds","getFolderChatsCount","isChat","chatOrUser","getMessageSenderName","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","body","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasAsyncOpenClassName","setHasAsyncOpenClassName","hasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","formatKey","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","setTrigger","trigger","getDeviceToken","subscription","toJSON","endpoint","isPushSupported","ServiceWorkerRegistration","Notification","permission","unsubscribeFromPush","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","deviceToken","unsubscribe","subscribeToPush","subscribe","userVisibleOnly","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleClick","handleMouseDown","aria-label","MenuItem","icon","destructive","handleKeyDown","keyCode","role","onKeyDown","RippleEffect","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","setValue","usePrevious","next","shouldSkipUndefined","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","updateNotifySettings","peerType","isSilent","isShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","DEFAULT_RANGE","begin","end","TRANSITION_DEFAULT_DURATION","LONG_PRESS_TIMEOUT","GUTTER","PLOT_HEIGHT","PLOT_TOP_PADDING","PLOT_LINE_WIDTH","PLOT_PIE_RADIUS_FACTOR","PLOT_PIE_SHIFT","PLOT_BARS_WIDTH_SHIFT","BALLOON_OFFSET","AXES_FONT","AXES_MAX_COLUMN_WIDTH","AXES_MAX_ROW_HEIGHT","X_AXIS_HEIGHT","X_AXIS_SHIFT_START","Y_AXIS_ZERO_BASED_THRESHOLD","MINIMAP_HEIGHT","MINIMAP_MARGIN","MINIMAP_LINE_WIDTH","MINIMAP_EAR_WIDTH","MINIMAP_MAX_ANIMATED_DATASETS","ZOOM_TIMEOUT","ZOOM_RANGE_DELTA","ZOOM_RANGE_MIDDLE","MONTHS","WEEK_DAYS","WEEK_DAYS_SHORT","SPEED_TEST_INTERVAL","SPEED_TEST_FAST_FPS","SIMPLIFIER_MIN_POINTS","SIMPLIFIER_PLOT_FACTOR","SIMPLIFIER_MINIMAP_FACTOR","ANIMATE_PROPS","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","onSelectWithEnter","focusedIndex","setFocusedIndex","focusedElement","activeElement","elementChildren","newIndex","focus","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","getFromMemory","cancelProgress","mediaData","fullSize","controller","windowSize","updateSizes","vh","setProperty","handleResize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","getHref","getDecodedUrl","decodedHref","decodeURI","convertPunycode","openTelegramLink","ctrlKey","altKey","shiftKey","metaKey","classNames","prevDeps","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","onTrigger","FILTERED_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","MESSAGE_DELETED","isInitialized","HEX_COLOR_REGEX","lerp","start","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","theme","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","toString","uncompressEmoji","emojiData","categories","emojiRaw","colons","native","image","openChat","openChatByUsername","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsSessionRemembered","authIsLoading","password","file","authIsLoadingQrCode","setItem","init","signOut","connectionState","authNearestCountry","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","saveSession","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","onUpdateConnectionState","currentUser","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","register","INITIAL_STATE","isLeftColumnShown","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","isBackgroundBlurred","patternColor","messageSendKeyCombo","shouldSuggestStickers","privacy","updateCacheThrottled","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","parse","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","hasCustomBackground","customBackground","isCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCodeAsync","AuthCode","useModuleLoader","AuthPasswordAsync","AuthPassword","AuthRegisterAsync","AuthRegister","AuthQrCodeAsync","AuthQrCode","MainAsync","renderMain","TeactDOM"],"mappings":"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","file":"main.3ac509d3ed06c3cff5da.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t1: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"fc1c82eed49224140317\",\"2\":\"f7d16accfb1c79ee906b\",\"3\":\"4bcadbdcb5986d5c9ba9\",\"4\":\"66638f18ab54b35d4ce9\",\"5\":\"42b78d9f9dc78dd3f534\",\"6\":\"2a86679c910dccf735ed\",\"7\":\"88b850357fba40015cab\",\"8\":\"be9a4dd2a4d166554abe\",\"9\":\"90b7985da07e3b6a4886\",\"10\":\"bd5435d947f7c8aea0ee\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"fc1c82eed49224140317\",\"2\":\"f7d16accfb1c79ee906b\",\"3\":\"4bcadbdcb5986d5c9ba9\",\"4\":\"66638f18ab54b35d4ce9\",\"5\":\"42b78d9f9dc78dd3f534\",\"6\":\"2a86679c910dccf735ed\",\"7\":\"88b850357fba40015cab\",\"8\":\"be9a4dd2a4d166554abe\",\"9\":\"90b7985da07e3b6a4886\",\"10\":\"bd5435d947f7c8aea0ee\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 90);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n scheduleNextState?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\n/* eslint-disable no-null/no-null */\nfunction helpGc(componentInstance: ComponentInstance) {\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n}\n\n/* eslint-enable no-null/no-null */\n\nfunction applyNextState(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.scheduleNextState || !componentInstance.forceUpdate) {\n componentInstance.scheduleNextState = throttleWithPrimaryRaf(() => applyNextState(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n }\n\n componentInstance.scheduleNextState();\n componentInstance.forceUpdate();\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","export const APP_INFO = process.env.APP_INFO || 'Telegram T';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const CHANNEL_MEMBERS_LIMIT = 30;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import React, {\n FC, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload) => {\n onDispatch(name, payload);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nfunction getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['LENGTH'];\n }\n\n return currentKeys.filter((prop) => currentProps[prop] !== newProps[prop]);\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Album';\n }\n\n if (photo) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Photo';\n }\n\n if (video) {\n if (video.isGif) {\n if (text) {\n return `${noEmoji ? '' : 'GIF '}${text.text}`;\n }\n\n return 'GIF';\n } else {\n if (text) {\n return `${noEmoji ? '' : '📹 '}${text.text}`;\n }\n\n return 'Video';\n }\n }\n\n if (sticker) {\n return `Sticker ${sticker.emoji}`;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n if (caption) {\n return `🎧 ${caption}`;\n }\n\n return 'Audio';\n }\n\n if (voice) {\n if (text) {\n return `${noEmoji ? '' : '🎤 '}${text.text}`;\n }\n\n return 'Voice Message';\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return 'Contact';\n }\n\n if (poll) {\n return `📊 ${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType,\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isChatSuperGroup, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID } from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat)) {\n return undefined;\n }\n\n if (isChatSuperGroup(chat)) {\n return chat.onlineCount;\n }\n\n if (!chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n const memberIds = chat.fullInfo.members.map((m) => m.userId);\n return memberIds.reduce((onlineCount, memberId) => {\n if (global.users.byId[memberId] && isUserOnline(global.users.byId[memberId])) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (chat && chat.unreadCount && !chat.isMuted) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n emoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const isMessageEditable = (\n (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return threadInfo.lastMessageId\n ? Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId)\n : threadInfo.lastReadInboxMessageId;\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n\n if (outlyingIds) {\n const found = outlyingIds.find((id) => {\n return !lastReadId || (id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled));\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = listedIds.find((id) => {\n return !lastReadId || (id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled));\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n isStatisticsShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStatisticsShown ? (\n RightColumnContent.Statistics\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'Mac OS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\n\nexport const DPR = window.devicePixelRatio || 1;\n\n// `mask-image` CSS property for custom background slows down the scroll performance significantly\nexport const MASK_IMAGE_ENABLED = IS_IOS;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n requestAnimationFrame(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafCallbacks.unshift(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n return fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionId = '') {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [sessionId],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n document.documentElement.lang = langCode;\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nexport function getTranslation(key: string, value?: any, format?: 'i') {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n const request = new Request(key);\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return response.json();\n default:\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n const request = new Request(key);\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return cache.put(request, response);\n}\n\nexport function clear(cacheName: string) {\n if (!cacheApi) {\n return undefined;\n }\n\n return cacheApi.delete(cacheName);\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 09.05.2020\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\u2624|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default >(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","import {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport interface ISettings extends Record {\n messageTextSize: number;\n customBackground?: string;\n patternColor?: string;\n isBackgroundBlurred?: boolean;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n theme: 'light' | 'dark';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n languages?: ApiLanguage[];\n language: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk';\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersIncludedChats,\n FoldersExcludedChats,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n Statistics,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n
\n
\n
\n );\n};\n\nexport default Spinner;\n","import {\n DEBUG_ALERT_MSG, GLOBAL_STATE_CACHE_KEY, GRAMJS_SESSION_ID_KEY,\n} from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache or the session and refresh the page.\n if (Date.now() - startedAt <= STARTUP_TIMEOUT) {\n if (localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n } else if (localStorage.getItem(GRAMJS_SESSION_ID_KEY)) {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n } else {\n return;\n }\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(user: ApiUser, lang: LangFn) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return 'bot';\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date();\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > today) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function getSortedUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\n\n if (priorityIds && priorityIds.includes(id)) {\n /*\n ** Assuming that online status expiration date can't be as far as two days from now,\n ** this should place priorityIds on top of the list.\n **\n ** We then subtract index of `id` in `priorityIds` to preserve selected order\n */\n return now + (48 * 60 * 60) - priorityIds.indexOf(id);\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { getTranslation } from '../../util/langProvider';\nimport { LangFn } from '../../hooks/useLang';\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\nexport function getChatTitle(chat: ApiChat, user?: ApiUser) {\n if (user && chat.id === user.id && user.isSelf) {\n return getTranslation('SavedMessages');\n }\n return chat.title || getTranslation('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id], folder, usersById, excludedChatIds, includedChatIds, pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (chat.isMuted && folder.excludeMuted) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!chat.isMuted && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n lang: LangFn,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return 'You';\n }\n\n return getUserFirstOrLastName(sender);\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n return currentKeys.every((prop) => currentProps[prop] === newProps[prop]);\n}\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement) {\n return (\n !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasAsyncOpenClassName, setHasAsyncOpenClassName] = useState(false);\n\n if (isOpen) {\n setIsClosed(false);\n setHasAsyncOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasAsyncOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n const hasOpenClassName = hasAsyncOpenClassName || (isOpen && noOpenTransition);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n hasOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","import { MILISECONDS_IN_DAY } from '../lib/lovely-chart/constants';\nimport { getTranslation } from './langProvider';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return getTranslation(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n getTranslation(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(date, format);\n}\n\nexport function formatFullDate(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = getTranslation('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatMonthAndYear(date: Date, isShort = false) {\n const format = getTranslation(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatHumanDate(datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(getTranslation(`Weekday.Short${weekDay}`))\n : upperFirst(getTranslation(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = getTranslation(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(date, format));\n}\n\nfunction formatDate(date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', getTranslation(MONTHS_FULL[monthIndex]))\n .replace('MMMM', getTranslation(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', getTranslation(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date) {\n return date.toLocaleString(\n 'en-US',\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import { callApi } from '../api/gramjs';\nimport { DEBUG } from '../config';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({ endpoint: data.endpoint, keys: data.keys });\n}\n\nexport function isPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nexport async function unsubscribeFromPush() {\n if (!isPushSupported) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (subscription) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unsubscribing', subscription);\n }\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n}\n\nexport async function subscribeToPush() {\n if (!isPushSupported()) return;\n await unsubscribeFromPush();\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n try {\n const subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Permission for Notifications was denied');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n }\n }\n}\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default RippleEffect;\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${emoji}\"`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ?
: '
',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/ig;\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = [...(part.match(RE_LINK) || []), ...(part.match(RE_MENTION) || [])];\n if (!links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n \n {nextLink}\n ,\n );\n } else {\n content.push(\n ,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { GlobalState } from '../../global/types';\nimport { ApiChat } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(global: GlobalState, chatId: number, chatUpdate: Partial): GlobalState {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.chats;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record;\n threadsById: Record;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n const newById = omit(byId, messageIds);\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.users;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ISettings } from '../../types';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, isShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: isShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasGroupMessagePreview: isShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: isShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n ref?: RefObject;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n};\n\nconst InputText: FC = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n}) => {\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n
\n \n {labelText && (\n \n )}\n
\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n \n );\n};\n\nexport default memo(Checkbox);\n","export const DPR = window.devicePixelRatio || 1;\n\nexport const DEFAULT_RANGE = { begin: 0.8, end: 1 };\nexport const TRANSITION_DEFAULT_DURATION = 300;\nexport const LONG_PRESS_TIMEOUT = 500;\n\nexport const GUTTER = 10;\nexport const PLOT_HEIGHT = 320;\nexport const PLOT_TOP_PADDING = 15;\nexport const PLOT_LINE_WIDTH = 2;\nexport const PLOT_PIE_RADIUS_FACTOR = 0.9 / 2;\nexport const PLOT_PIE_SHIFT = 10;\nexport const PLOT_BARS_WIDTH_SHIFT = 0.5;\n\nexport const BALLOON_OFFSET = 20;\n\nexport const AXES_FONT = '300 10px Helvetica, Arial, sans-serif';\nexport const AXES_MAX_COLUMN_WIDTH = 45;\nexport const AXES_MAX_ROW_HEIGHT = 50;\nexport const X_AXIS_HEIGHT = 30;\nexport const X_AXIS_SHIFT_START = 1;\nexport const Y_AXIS_ZERO_BASED_THRESHOLD = 0.1;\n\nexport const MINIMAP_HEIGHT = 40;\nexport const MINIMAP_MARGIN = 10;\nexport const MINIMAP_LINE_WIDTH = 1;\nexport const MINIMAP_EAR_WIDTH = 8;\nexport const MINIMAP_MAX_ANIMATED_DATASETS = 4;\n\nexport const ZOOM_TIMEOUT = TRANSITION_DEFAULT_DURATION;\nexport const ZOOM_RANGE_DELTA = 0.1;\nexport const ZOOM_RANGE_MIDDLE = .5;\n\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport const WEEK_DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nexport const WEEK_DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport const SPEED_TEST_INTERVAL = 200;\nexport const SPEED_TEST_FAST_FPS = 4;\n\nexport const SIMPLIFIER_MIN_POINTS = 1000;\nexport const SIMPLIFIER_PLOT_FACTOR = 1;\nexport const SIMPLIFIER_MINIMAP_FACTOR = 0.5;\n\nexport const ANIMATE_PROPS = [\n // Viewport X-axis\n 'begin 200 fast', 'end 200 fast', 'labelFromIndex 200 fast floor', 'labelToIndex 200 fast ceil',\n\n // X-axis labels\n 'xAxisScale 400',\n\n // Viewport Y-axis\n 'yMinViewport', 'yMaxViewport', 'yMinViewportSecond', 'yMaxViewportSecond',\n\n // Minimap Y-axis\n 'yMinMinimap', 'yMaxMinimap', 'yMinMinimapSecond', 'yMaxMinimapSecond',\n\n // Y-axis labels\n 'yAxisScale', 'yAxisScaleSecond',\n];\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration: number) => {\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","export const MEMO_EMPTY_ARRAY = [];\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n\n useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n
\n );\n};\n\nexport default Menu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: () => void,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [isOpen]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter();\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [focusedIndex, elementRef, onSelectWithEnter]);\n\n return handleKeyDown;\n};\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","import { throttle } from './schedulers';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nlet windowSize = updateSizes();\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport default {\n get: () => windowSize,\n};\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n openTelegramLink,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [openTelegramLink, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n \n {children || text}\n \n );\n};\n\nfunction getHref(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `http://${url}`;\n}\n\nfunction getDecodedUrl(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = getHref(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openTelegramLink']),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","const STRIPE_ERRORS: Record> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n
\n );\n};\n\nexport default DropdownMenu;\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\n}\n\nexport interface ApiPhoto {\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash: string;\n emoji: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('disable-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('disable-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array;\n emojis: Record;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1])) {\n category.emojis.push(emojiRaw[1]);\n emojiData.emojis[emojiRaw[1]] = {\n id: emojiRaw[1],\n colons: `:${emojiRaw[1]}:`,\n native: unifiedToNative(emojiRaw[0]),\n image: emojiRaw[0].toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick;\n\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default withGlobal(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"780771c8627efba795b7.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\n\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel > 0);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { GRAMJS_SESSION_ID_KEY } from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { unsubscribeFromPush } from '../../../util/pushNotifications';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n void initApi(actions.apiUpdate, sessionId);\n\n return {\n ...global,\n authIsSessionRemembered: Boolean(sessionId),\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('gotToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionId } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n});\n\naddReducer('signOut', () => {\n void signOut();\n});\n\nasync function signOut() {\n await unsubscribeFromPush();\n await callApi('destroy');\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n\n getDispatch().init();\n}\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG } from '../../../config';\nimport { subscribeToPush } from '../../../util/pushNotifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribeToPush();\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n const { sessionId } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId });\n }\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker ready');\n }\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker not available');\n }\n getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker registration failed: ', err);\n }\n }\n });\n}\n","import { GlobalState } from './types';\n\nimport { ANIMATION_LEVEL_DEFAULT, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR } from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n isBackgroundBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n privacy: {},\n },\n\n twoFaSettings: {},\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n addCallback(updateCacheThrottled);\n });\n\n addReducer('signOut', () => {\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n }\n }\n\n return undefined;\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults for new settings which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authIsSessionRemembered',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'chatFolders',\n 'topPeers',\n 'recentEmojis',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_MOBILE_SCREEN ? undefined : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey } = global.settings;\n\n return {\n byKey,\n privacy: {},\n };\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\n});\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n isCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC = ({\n page,\n children,\n hasCustomBackground,\n isCustomBackgroundColor,\n isRightColumnShown,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n preloadTasks[page](),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n
\n {children}\n {shouldRenderMask && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(global.settings.byKey.customBackground),\n isCustomBackgroundColor: Boolean((global.settings.byKey.customBackground || '').match(/^#[a-f\\d]{6,8}$/i)),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n No countries matched your filter.\n \n )}\n \n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport {\n CUSTOM_BG_CACHE_NAME,\n LANG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../../config';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport * as cacheApi from '../../util/cacheApi';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryById, getCountryFromPhoneNumber } from '../../util/phoneNumber';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\n// Cache clearing may be heavy so we delay it\nconst CLEAR_CACHE_DELAY = 2000;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n // Media cache storage is always enabled, so we clear it only when user by any chance returned to the auth page\n useEffect(() => {\n setTimeout(() => {\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n cacheApi.clear(LANG_CACHE_NAME);\n }, CLEAR_CACHE_DELAY);\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n parseFullNumber(value);\n }, [authError, clearAuthError, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n
\n
\n
\n

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? : ;\n};\n\nexport default AuthCodeAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? : ;\n};\n\nexport default AuthPasswordAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? : ;\n};\n\nexport default AuthRegisterAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default AuthQrCodeAsync;\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, initApi }) => {\n useEffect(() => {\n initApi();\n }, [initApi]);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['initApi']),\n)(Auth));\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ?
: undefined;\n};\n\nexport default MainAsync;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalState } from './global/types';\n\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\n\nconst App: FC = ({ authState, authIsSessionRemembered }) => {\n useEffect(() => {\n updateSizes();\n }, []);\n\n // return ;\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return authIsSessionRemembered ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState', 'authIsSessionRemembered']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/main.7a5c484269dea8524beb.js.map b/dist/main.7a5c484269dea8524beb.js.map deleted file mode 100644 index 812ccc149..000000000 --- a/dist/main.7a5c484269dea8524beb.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/types/index.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/types/index.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/lib/lovely-chart/constants.js","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/emoji.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/util/setupPushNotifications.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","1","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","getTarget","setTarget","useState","initial","newValue","scheduleNextState","throttleWithPrimaryRaf","applyNextState","throttleWithRaf","currentElement","forceUpdateComponent","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","propsRef","renderedRef","addEventListener","orderBy","values","APP_INFO","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","Set","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","LAYERS_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","getUnequalProps","join","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","id","generateIdFor","useForceUpdate","delete","set","currentProps","newProps","currentKeys","filter","prop","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","caption","title","performer","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","isChatSuperGroup","onlineCount","fullInfo","members","memberId","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","isMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","selectFirstUnreadId","outlyingIds","lastReadId","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","settings","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","isStatisticsShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","Statistics","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","DPR","devicePixelRatio","MASK_IMAGE_ENABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","throttleWithTickEnd","waiting","onIdle","requestIdleCallback","pause","rafPromise","requestAnimationFrame","fastRafCallbacks","isPrimary","unshift","currentCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionId","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","cache","langPack","runCallbacks","createCallbackManager","currentLangCode","async","setLanguage","langCode","lang","newLangPack","cached","cacheApi","Json","remote","sourceLangPacks","fetchFromCacheOrRemote","fetch","pairs","json","extraLangPack","clear","getTranslation","format","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","caches","Type","cacheName","Request","open","Blob","blob","substr","headers","save","cacheData","JSON","stringify","Response","put","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","canvas","videoWidth","videoHeight","getContext","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","store","random","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","getSortedUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","isNotJoined","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","privateChatUser","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","filters","pinnedIds","getFolderChatsCount","isChat","chatOrUser","getMessageSenderName","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","body","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasAsyncOpenClassName","setHasAsyncOpenClassName","hasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","formatKey","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","setTrigger","trigger","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleClick","handleMouseDown","aria-label","MenuItem","icon","destructive","handleKeyDown","keyCode","role","onKeyDown","RippleEffect","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","setValue","usePrevious","next","shouldSkipUndefined","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","updateNotifySettings","peerType","isSilent","isShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","DEFAULT_RANGE","begin","end","TRANSITION_DEFAULT_DURATION","LONG_PRESS_TIMEOUT","GUTTER","PLOT_HEIGHT","PLOT_TOP_PADDING","PLOT_LINE_WIDTH","PLOT_PIE_RADIUS_FACTOR","PLOT_PIE_SHIFT","PLOT_BARS_WIDTH_SHIFT","BALLOON_OFFSET","AXES_FONT","AXES_MAX_COLUMN_WIDTH","AXES_MAX_ROW_HEIGHT","X_AXIS_HEIGHT","X_AXIS_SHIFT_START","Y_AXIS_ZERO_BASED_THRESHOLD","MINIMAP_HEIGHT","MINIMAP_MARGIN","MINIMAP_LINE_WIDTH","MINIMAP_EAR_WIDTH","MINIMAP_MAX_ANIMATED_DATASETS","ZOOM_TIMEOUT","ZOOM_RANGE_DELTA","ZOOM_RANGE_MIDDLE","MONTHS","WEEK_DAYS","WEEK_DAYS_SHORT","SPEED_TEST_INTERVAL","SPEED_TEST_FAST_FPS","SIMPLIFIER_MIN_POINTS","SIMPLIFIER_PLOT_FACTOR","SIMPLIFIER_MINIMAP_FACTOR","ANIMATE_PROPS","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","onSelectWithEnter","focusedIndex","setFocusedIndex","focusedElement","activeElement","elementChildren","newIndex","focus","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","getFromMemory","cancelProgress","mediaData","serviceWorker","fullSize","controller","windowSize","updateSizes","vh","setProperty","handleResize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","getHref","getDecodedUrl","decodedHref","decodeURI","convertPunycode","openTelegramLink","ctrlKey","altKey","shiftKey","metaKey","classNames","prevDeps","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","onTrigger","FILTERED_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","MESSAGE_DELETED","isInitialized","HEX_COLOR_REGEX","lerp","start","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","theme","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","toString","uncompressEmoji","emojiData","categories","emojiRaw","colons","native","image","openChat","openChatByUsername","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsSessionRemembered","authIsLoading","password","file","authIsLoadingQrCode","setItem","init","signOut","connectionState","authNearestCountry","getDeviceToken","subscription","toJSON","endpoint","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","saveSession","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","ServiceWorkerRegistration","Notification","permission","serviceWorkerRegistration","ready","pushManager","getSubscription","deviceToken","unsubscribe","subscribe","userVisibleOnly","setupPushNotifications","onUpdateConnectionState","currentUser","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","register","INITIAL_STATE","isLeftColumnShown","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","isBackgroundBlurred","patternColor","messageSendKeyCombo","shouldSuggestStickers","privacy","updateCacheThrottled","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","parse","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","hasCustomBackground","customBackground","isCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCodeAsync","AuthCode","useModuleLoader","AuthPasswordAsync","AuthPassword","AuthRegisterAsync","AuthRegister","AuthQrCodeAsync","AuthQrCode","MainAsync","renderMain","TeactDOM"],"mappings":"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","file":"main.7a5c484269dea8524beb.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t1: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"8629ed7398bb928b5cf9\",\"2\":\"e4ac6d760c71882d981f\",\"3\":\"b70839d141349ff143e4\",\"4\":\"413c0f1376b6d9916861\",\"5\":\"006c0b4aaa5f2289238f\",\"6\":\"07bb6a4903ade91c5d4d\",\"7\":\"c159a33671ef703989f8\",\"8\":\"3b501d6b87ba28c80c1e\",\"9\":\"da33fce98fc64caf92cc\",\"10\":\"5c1fcaa030b8e2a15227\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"8629ed7398bb928b5cf9\",\"2\":\"e4ac6d760c71882d981f\",\"3\":\"b70839d141349ff143e4\",\"4\":\"413c0f1376b6d9916861\",\"5\":\"006c0b4aaa5f2289238f\",\"6\":\"07bb6a4903ade91c5d4d\",\"7\":\"c159a33671ef703989f8\",\"8\":\"3b501d6b87ba28c80c1e\",\"9\":\"da33fce98fc64caf92cc\",\"10\":\"5c1fcaa030b8e2a15227\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 89);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n scheduleNextState?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\n/* eslint-disable no-null/no-null */\nfunction helpGc(componentInstance: ComponentInstance) {\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n}\n\n/* eslint-enable no-null/no-null */\n\nfunction applyNextState(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.scheduleNextState || !componentInstance.forceUpdate) {\n componentInstance.scheduleNextState = throttleWithPrimaryRaf(() => applyNextState(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n }\n\n componentInstance.scheduleNextState();\n componentInstance.forceUpdate();\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","export const APP_INFO = process.env.APP_INFO || 'Telegram T';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const CHANNEL_MEMBERS_LIMIT = 30;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import React, {\n FC, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload) => {\n onDispatch(name, payload);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nfunction getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['LENGTH'];\n }\n\n return currentKeys.filter((prop) => currentProps[prop] !== newProps[prop]);\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Album';\n }\n\n if (photo) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Photo';\n }\n\n if (video) {\n if (video.isGif) {\n if (text) {\n return `${noEmoji ? '' : 'GIF '}${text.text}`;\n }\n\n return 'GIF';\n } else {\n if (text) {\n return `${noEmoji ? '' : '📹 '}${text.text}`;\n }\n\n return 'Video';\n }\n }\n\n if (sticker) {\n return `Sticker ${sticker.emoji}`;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n if (caption) {\n return `🎧 ${caption}`;\n }\n\n return 'Audio';\n }\n\n if (voice) {\n if (text) {\n return `${noEmoji ? '' : '🎤 '}${text.text}`;\n }\n\n return 'Voice Message';\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return 'Contact';\n }\n\n if (poll) {\n return `📊 ${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType,\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isChatSuperGroup, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID } from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat)) {\n return undefined;\n }\n\n if (isChatSuperGroup(chat)) {\n return chat.onlineCount;\n }\n\n if (!chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n const memberIds = chat.fullInfo.members.map((m) => m.userId);\n return memberIds.reduce((onlineCount, memberId) => {\n if (global.users.byId[memberId] && isUserOnline(global.users.byId[memberId])) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (chat && chat.unreadCount && !chat.isMuted) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n emoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const isMessageEditable = (\n (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return threadInfo.lastMessageId\n ? Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId)\n : threadInfo.lastReadInboxMessageId;\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n\n if (outlyingIds) {\n const found = outlyingIds.find((id) => {\n return !lastReadId || (id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled));\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = listedIds.find((id) => {\n return !lastReadId || (id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled));\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n isStatisticsShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStatisticsShown ? (\n RightColumnContent.Statistics\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'Mac OS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\n\nexport const DPR = window.devicePixelRatio || 1;\n\n// `mask-image` CSS property for custom background slows down the scroll performance significantly\nexport const MASK_IMAGE_ENABLED = IS_IOS;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n requestAnimationFrame(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafCallbacks.unshift(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n return fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionId = '') {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [sessionId],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n document.documentElement.lang = langCode;\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nexport function getTranslation(key: string, value?: any, format?: 'i') {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n const request = new Request(key);\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return response.json();\n default:\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n const request = new Request(key);\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return cache.put(request, response);\n}\n\nexport function clear(cacheName: string) {\n if (!cacheApi) {\n return undefined;\n }\n\n return cacheApi.delete(cacheName);\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 09.05.2020\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\u2624|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default >(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","import {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport interface ISettings extends Record {\n messageTextSize: number;\n customBackground?: string;\n patternColor?: string;\n isBackgroundBlurred?: boolean;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n theme: 'light' | 'dark';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n languages?: ApiLanguage[];\n language: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk';\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersIncludedChats,\n FoldersExcludedChats,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n Statistics,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n
\n
\n
\n );\n};\n\nexport default Spinner;\n","import {\n DEBUG_ALERT_MSG, GLOBAL_STATE_CACHE_KEY, GRAMJS_SESSION_ID_KEY,\n} from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache or the session and refresh the page.\n if (Date.now() - startedAt <= STARTUP_TIMEOUT) {\n if (localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n } else if (localStorage.getItem(GRAMJS_SESSION_ID_KEY)) {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n } else {\n return;\n }\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(user: ApiUser, lang: LangFn) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return 'bot';\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date();\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > today) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function getSortedUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\n\n if (priorityIds && priorityIds.includes(id)) {\n /*\n ** Assuming that online status expiration date can't be as far as two days from now,\n ** this should place priorityIds on top of the list.\n **\n ** We then subtract index of `id` in `priorityIds` to preserve selected order\n */\n return now + (48 * 60 * 60) - priorityIds.indexOf(id);\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { getTranslation } from '../../util/langProvider';\nimport { LangFn } from '../../hooks/useLang';\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\nexport function getChatTitle(chat: ApiChat, user?: ApiUser) {\n if (user && chat.id === user.id && user.isSelf) {\n return getTranslation('SavedMessages');\n }\n return chat.title || getTranslation('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id], folder, usersById, excludedChatIds, includedChatIds, pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (chat.isMuted && folder.excludeMuted) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!chat.isMuted && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n lang: LangFn,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return 'You';\n }\n\n return getUserFirstOrLastName(sender);\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n return currentKeys.every((prop) => currentProps[prop] === newProps[prop]);\n}\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement) {\n return (\n !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasAsyncOpenClassName, setHasAsyncOpenClassName] = useState(false);\n\n if (isOpen) {\n setIsClosed(false);\n setHasAsyncOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasAsyncOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n const hasOpenClassName = hasAsyncOpenClassName || (isOpen && noOpenTransition);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n hasOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","import { MILISECONDS_IN_DAY } from '../lib/lovely-chart/constants';\nimport { getTranslation } from './langProvider';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return getTranslation(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n getTranslation(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(date, format);\n}\n\nexport function formatFullDate(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = getTranslation('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatMonthAndYear(date: Date, isShort = false) {\n const format = getTranslation(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatHumanDate(datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(getTranslation(`Weekday.Short${weekDay}`))\n : upperFirst(getTranslation(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = getTranslation(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(date, format));\n}\n\nfunction formatDate(date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', getTranslation(MONTHS_FULL[monthIndex]))\n .replace('MMMM', getTranslation(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', getTranslation(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date) {\n return date.toLocaleString(\n 'en-US',\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default RippleEffect;\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${emoji}\"`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ?
: '
',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/ig;\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = [...(part.match(RE_LINK) || []), ...(part.match(RE_MENTION) || [])];\n if (!links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n \n {nextLink}\n ,\n );\n } else {\n content.push(\n ,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { GlobalState } from '../../global/types';\nimport { ApiChat } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(global: GlobalState, chatId: number, chatUpdate: Partial): GlobalState {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.chats;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record;\n threadsById: Record;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n const newById = omit(byId, messageIds);\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.users;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ISettings } from '../../types';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, isShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: isShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasGroupMessagePreview: isShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: isShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n ref?: RefObject;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n};\n\nconst InputText: FC = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n}) => {\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n
\n \n {labelText && (\n \n )}\n
\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n \n );\n};\n\nexport default memo(Checkbox);\n","export const DPR = window.devicePixelRatio || 1;\n\nexport const DEFAULT_RANGE = { begin: 0.8, end: 1 };\nexport const TRANSITION_DEFAULT_DURATION = 300;\nexport const LONG_PRESS_TIMEOUT = 500;\n\nexport const GUTTER = 10;\nexport const PLOT_HEIGHT = 320;\nexport const PLOT_TOP_PADDING = 15;\nexport const PLOT_LINE_WIDTH = 2;\nexport const PLOT_PIE_RADIUS_FACTOR = 0.9 / 2;\nexport const PLOT_PIE_SHIFT = 10;\nexport const PLOT_BARS_WIDTH_SHIFT = 0.5;\n\nexport const BALLOON_OFFSET = 20;\n\nexport const AXES_FONT = '300 10px Helvetica, Arial, sans-serif';\nexport const AXES_MAX_COLUMN_WIDTH = 45;\nexport const AXES_MAX_ROW_HEIGHT = 50;\nexport const X_AXIS_HEIGHT = 30;\nexport const X_AXIS_SHIFT_START = 1;\nexport const Y_AXIS_ZERO_BASED_THRESHOLD = 0.1;\n\nexport const MINIMAP_HEIGHT = 40;\nexport const MINIMAP_MARGIN = 10;\nexport const MINIMAP_LINE_WIDTH = 1;\nexport const MINIMAP_EAR_WIDTH = 8;\nexport const MINIMAP_MAX_ANIMATED_DATASETS = 4;\n\nexport const ZOOM_TIMEOUT = TRANSITION_DEFAULT_DURATION;\nexport const ZOOM_RANGE_DELTA = 0.1;\nexport const ZOOM_RANGE_MIDDLE = .5;\n\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport const WEEK_DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nexport const WEEK_DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport const SPEED_TEST_INTERVAL = 200;\nexport const SPEED_TEST_FAST_FPS = 4;\n\nexport const SIMPLIFIER_MIN_POINTS = 1000;\nexport const SIMPLIFIER_PLOT_FACTOR = 1;\nexport const SIMPLIFIER_MINIMAP_FACTOR = 0.5;\n\nexport const ANIMATE_PROPS = [\n // Viewport X-axis\n 'begin 200 fast', 'end 200 fast', 'labelFromIndex 200 fast floor', 'labelToIndex 200 fast ceil',\n\n // X-axis labels\n 'xAxisScale 400',\n\n // Viewport Y-axis\n 'yMinViewport', 'yMaxViewport', 'yMinViewportSecond', 'yMaxViewportSecond',\n\n // Minimap Y-axis\n 'yMinMinimap', 'yMaxMinimap', 'yMinMinimapSecond', 'yMaxMinimapSecond',\n\n // Y-axis labels\n 'yAxisScale', 'yAxisScaleSecond',\n];\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration: number) => {\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","export const MEMO_EMPTY_ARRAY = [];\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n\n useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n
\n );\n};\n\nexport default Menu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: () => void,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [isOpen]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter();\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [focusedIndex, elementRef, onSelectWithEnter]);\n\n return handleKeyDown;\n};\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","import { throttle } from './schedulers';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nlet windowSize = updateSizes();\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport default {\n get: () => windowSize,\n};\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n openTelegramLink,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [openTelegramLink, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n \n {children || text}\n \n );\n};\n\nfunction getHref(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `http://${url}`;\n}\n\nfunction getDecodedUrl(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = getHref(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openTelegramLink']),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","const STRIPE_ERRORS: Record> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n
\n );\n};\n\nexport default DropdownMenu;\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\n}\n\nexport interface ApiPhoto {\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash: string;\n emoji: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('disable-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('disable-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array;\n emojis: Record;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1])) {\n category.emojis.push(emojiRaw[1]);\n emojiData.emojis[emojiRaw[1]] = {\n id: emojiRaw[1],\n colons: `:${emojiRaw[1]}:`,\n native: unifiedToNative(emojiRaw[0]),\n image: emojiRaw[0].toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick;\n\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default withGlobal(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"e4b96b4136ca0ce3a4aa.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\n\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel > 0);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { GRAMJS_SESSION_ID_KEY } from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n void initApi(actions.apiUpdate, sessionId);\n\n return {\n ...global,\n authIsSessionRemembered: Boolean(sessionId),\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('gotToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionId } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n});\n\naddReducer('signOut', () => {\n void signOut();\n});\n\nasync function signOut() {\n await callApi('destroy');\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n\n getDispatch().init();\n}\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n","import { callApi } from '../api/gramjs';\nimport { DEBUG } from '../config';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({ endpoint: data.endpoint, keys: data.keys });\n}\n\nexport async function setupPushNotifications() {\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Push notifications aren\\'t supported.');\n }\n return;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] The user has blocked push notifications.');\n }\n return;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Push messaging isn\\'t supported.');\n }\n }\n\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n const result = await callApi('registerDevice', deviceToken);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] registerDevice result', result);\n }\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Permission for Notifications was denied');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n }\n }\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG } from '../../../config';\nimport { setupPushNotifications } from '../../../util/setupPushNotifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n const { sessionId } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId });\n }\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n setupPushNotifications();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker ready');\n }\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker not available');\n }\n getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker registration failed: ', err);\n }\n }\n });\n}\n","import { GlobalState } from './types';\n\nimport { ANIMATION_LEVEL_DEFAULT, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR } from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n isBackgroundBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n privacy: {},\n },\n\n twoFaSettings: {},\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n addCallback(updateCacheThrottled);\n });\n\n addReducer('signOut', () => {\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n }\n }\n\n return undefined;\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults for new settings which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authIsSessionRemembered',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'chatFolders',\n 'topPeers',\n 'recentEmojis',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_MOBILE_SCREEN ? undefined : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey } = global.settings;\n\n return {\n byKey,\n privacy: {},\n };\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\n});\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n isCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC = ({\n page,\n children,\n hasCustomBackground,\n isCustomBackgroundColor,\n isRightColumnShown,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n preloadTasks[page](),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n
\n {children}\n {shouldRenderMask && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(global.settings.byKey.customBackground),\n isCustomBackgroundColor: Boolean((global.settings.byKey.customBackground || '').match(/^#[a-f\\d]{6,8}$/i)),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n No countries matched your filter.\n \n )}\n \n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport {\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n LANG_CACHE_NAME,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport * as cacheApi from '../../util/cacheApi';\nimport { formatPhoneNumber, getCountryFromPhoneNumber, getCountryById } from '../../util/phoneNumber';\nimport preloadFonts from '../../util/fonts';\nimport { preloadImage } from '../../util/files';\nimport { pick } from '../../util/iteratees';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport CountryCodeInput from './CountryCodeInput';\nimport Checkbox from '../ui/Checkbox';\nimport Loading from '../ui/Loading';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\n// Cache clearing may be heavy so we delay it\nconst CLEAR_CACHE_DELAY = 2000;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n // Media cache storage is always enabled, so we clear it only when user by any chance returned to the auth page\n useEffect(() => {\n setTimeout(() => {\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n cacheApi.clear(LANG_CACHE_NAME);\n }, CLEAR_CACHE_DELAY);\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n parseFullNumber(value);\n }, [authError, clearAuthError, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n
\n
\n
\n

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? : ;\n};\n\nexport default AuthCodeAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? : ;\n};\n\nexport default AuthPasswordAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? : ;\n};\n\nexport default AuthRegisterAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default AuthQrCodeAsync;\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, initApi }) => {\n useEffect(() => {\n initApi();\n }, [initApi]);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['initApi']),\n)(Auth));\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ?
: undefined;\n};\n\nexport default MainAsync;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalState } from './global/types';\n\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\n\nconst App: FC = ({ authState, authIsSessionRemembered }) => {\n useEffect(() => {\n updateSizes();\n }, []);\n\n // return ;\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return authIsSessionRemembered ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState', 'authIsSessionRemembered']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/report.html b/dist/report.html index 03b2447d7..9b5c48dcd 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [29 Apr 2021 at 03:16] + telegram-t [29 Apr 2021 at 13:10] diff --git a/dist/serviceWorker.js b/dist/serviceWorker.js index 32d8dc2d1..618021d7f 100644 --- a/dist/serviceWorker.js +++ b/dist/serviceWorker.js @@ -1,2 +1,2 @@ -!function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight;const s=new Map;async function r(e){const{url:t}=e.request,n=e.request.headers.get("range"),r=/^bytes=(\d+)-(\d+)?$/g.exec(n||""),a=Number(r[1]),i=Number(r[2]);let o=i;if((!o||o-a+1>524288)&&(o=a+524288-1),0===a&&1===o){const t=e.request.url.match(/fileSize=(\d+)&mimeType=([\w/]+)/),n=t&&Number(t[1]),s=t&&t[2];if(n&&s)return new Response(new Uint8Array(2).buffer,{status:206,statusText:"Partial Content",headers:[["Content-Range","bytes 0-1/"+n],["Accept-Ranges","bytes"],["Content-Length","2"],["Content-Type",s]]})}const c=`${t}?start=${a}&end=${o}`,[l,u]=await async function(e){const t=await self.caches.open("tt-media-progressive");return Promise.all([t.match(e+"&type=arrayBuffer").then(e=>e?e.arrayBuffer():void 0),t.match(e+"&type=headers").then(e=>e?e.json():void 0)])}(c);if(l)return new Response(l,{status:206,statusText:"Partial Content",headers:u});let f;try{f=await async function(e,t){if(!e.clientId)return;const n=await self.clients.get(e.clientId);if(!n)return;const r=(e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t})(s),a={},i=Promise.race([(o=3e4,new Promise(e=>{setTimeout(()=>e(),o)})).then(()=>Promise.reject(new Error("ERROR_PART_TIMEOUT"))),new Promise((e,t)=>{Object.assign(a,{resolve:e,reject:t})})]);var o;return s.set(r,a),i.catch(()=>{}).finally(()=>{s.delete(r)}),n.postMessage({type:"requestPart",messageId:r,params:t}),i}(e,{url:t,start:a,end:o})}catch(e){0}if(!f)return new Response("",{status:500,statusText:"Failed to fetch progressive part"});const{arrayBuffer:d,fullSize:p,mimeType:y}=f,h=Math.min(o-a+1,d.byteLength);o=a+h-1;const w=d.slice(0,h),g=[["Content-Range",`bytes ${a}-${o}/${p}`],["Accept-Ranges","bytes"],["Content-Length",String(h)],["Content-Type",y]];return h<=524288&&o<2097151&&async function(e,t,n){const s=await self.caches.open("tt-media-progressive");Promise.all([s.put(new Request(e+"&type=arrayBuffer"),new Response(t)),s.put(new Request(e+"&type=headers"),new Response(JSON.stringify(n)))])}(c,w,g),new Response(w,{status:206,statusText:"Partial Content",headers:g})}self.addEventListener("message",e=>{const{type:t,messageId:n,result:r}=e.data;if("partResponse"===t){const e=s.get(n);e&&e.resolve(r)}});const a=/[0-9a-f]{20}.*\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;self.addEventListener("install",e=>{e.waitUntil(self.skipWaiting())}),self.addEventListener("activate",e=>{e.waitUntil(self.caches.delete("tt-assets")),e.waitUntil(self.clients.claim())}),self.addEventListener("fetch",e=>{e.respondWith((()=>{const{url:t}=e.request;return t.includes("/progressive/")?r(e):t.startsWith("http")&&t.match(a)?async function(e){const t=await self.caches.open("tt-assets"),n=await t.match(e.request);if(n)return n;const s=await fetch(e.request);return t.put(e.request,s.clone()),s}(e):fetch(e.request)})())}),self.addEventListener("push",e=>{if(!e.data)return;let t;try{t=e.data.json()}catch(n){t=e.data.text()}const n=t.title||"Telegram",s={body:t.description||t,icon:"android-chrome-192x192.png"};e.waitUntil(self.registration.showNotification(n,s))}),self.addEventListener("notificationclick",e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:"window"}).then(e=>{for(let t=0;t524288)&&(o=a+524288-1),0===a&&1===o){const t=e.request.url.match(/fileSize=(\d+)&mimeType=([\w/]+)/),n=t&&Number(t[1]),s=t&&t[2];if(n&&s)return new Response(new Uint8Array(2).buffer,{status:206,statusText:"Partial Content",headers:[["Content-Range","bytes 0-1/"+n],["Accept-Ranges","bytes"],["Content-Length","2"],["Content-Type",s]]})}const c=`${t}?start=${a}&end=${o}`,[l,u]=await async function(e){const t=await self.caches.open("tt-media-progressive");return Promise.all([t.match(e+"&type=arrayBuffer").then(e=>e?e.arrayBuffer():void 0),t.match(e+"&type=headers").then(e=>e?e.json():void 0)])}(c);if(l)return new Response(l,{status:206,statusText:"Partial Content",headers:u});let f;try{f=await async function(e,t){if(!e.clientId)return;const n=await self.clients.get(e.clientId);if(!n)return;const r=(e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t})(s),a={},i=Promise.race([(o=3e4,new Promise(e=>{setTimeout(()=>e(),o)})).then(()=>Promise.reject(new Error("ERROR_PART_TIMEOUT"))),new Promise((e,t)=>{Object.assign(a,{resolve:e,reject:t})})]);var o;return s.set(r,a),i.catch(()=>{}).finally(()=>{s.delete(r)}),n.postMessage({type:"requestPart",messageId:r,params:t}),i}(e,{url:t,start:a,end:o})}catch(e){0}if(!f)return new Response("",{status:500,statusText:"Failed to fetch progressive part"});const{arrayBuffer:d,fullSize:p,mimeType:h}=f,y=Math.min(o-a+1,d.byteLength);o=a+y-1;const g=d.slice(0,y),w=[["Content-Range",`bytes ${a}-${o}/${p}`],["Accept-Ranges","bytes"],["Content-Length",String(y)],["Content-Type",h]];return y<=524288&&o<2097151&&async function(e,t,n){const s=await self.caches.open("tt-media-progressive");Promise.all([s.put(new Request(e+"&type=arrayBuffer"),new Response(t)),s.put(new Request(e+"&type=headers"),new Response(JSON.stringify(n)))])}(c,g,w),new Response(g,{status:206,statusText:"Partial Content",headers:w})}let a;self.addEventListener("message",e=>{const{type:t,messageId:n,result:r}=e.data;if("partResponse"===t){const e=s.get(n);e&&e.resolve(r)}}),function(e){e.MESSAGE_TEXT="MESSAGE_TEXT",e.MESSAGE_NOTEXT="MESSAGE_NOTEXT",e.MESSAGE_STICKER="MESSAGE_STICKER"}(a||(a={}));const i=/[0-9a-f]{20}.*\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;self.addEventListener("install",e=>{e.waitUntil(self.skipWaiting())}),self.addEventListener("activate",e=>{e.waitUntil(self.caches.delete("tt-assets")),e.waitUntil(self.clients.claim())}),self.addEventListener("fetch",e=>{e.respondWith((()=>{const{url:t}=e.request;return t.includes("/progressive/")?r(e):t.startsWith("http")&&t.match(i)?async function(e){const t=await self.caches.open("tt-assets"),n=await t.match(e.request);if(n)return n;const s=await fetch(e.request);return t.put(e.request,s.clone()),s}(e):fetch(e.request)})())}),self.addEventListener("push",(function(e){if(!e.data)return;let t;try{t=e.data.json()}catch(e){return void 0}const n=t.title||"Telegram WebZ alpha ccff995",s={body:t.description,icon:"android-chrome-192x192.png"};e.waitUntil(self.registration.showNotification(n,s))})),self.addEventListener("notificationclick",(function(e){e.notification.close(),e.waitUntil(self.clients.matchAll({type:"window"}).then(e=>{for(let t=0;t= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const CHANNEL_MEMBERS_LIMIT = 30;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import { pause } from '../util/schedulers';\nimport generateIdFor from '../util/generateIdFor';\nimport {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 30000;\n\nconst requestStates = new Map();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const match = e.request.url.match(/fileSize=(\\d+)&mimeType=([\\w/]+)/);\n const fileSize = match && Number(match[1]);\n const mimeType = match && match[2];\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n const cacheKey = `${url}?start=${start}&end=${end}`;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(cacheKey: string) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nasync function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise {\n if (!e.clientId) {\n return undefined;\n }\n\n // eslint-disable-next-line no-restricted-globals\n const client = await self.clients.get(e.clientId);\n if (!client) {\n return undefined;\n }\n\n const messageId = generateIdFor(requestStates);\n const requestState = {} as RequestStates;\n\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => Promise.reject(new Error('ERROR_PART_TIMEOUT'))),\n new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n requestAnimationFrame(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafCallbacks.unshift(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n return fastRaf(callback, true);\n}\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n // Become available to all pages\n e.waitUntil(clearAssetCache());\n e.waitUntil(self.clients.claim());\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n e.respondWith((() => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n return respondForProgressive(e);\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n return respondWithCache(e);\n }\n\n return fetch(e.request);\n })());\n});\n\n\nself.addEventListener('push', (e: PushEvent) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log(`[SW] Push received with data \"${e.data.text()}\"`);\n }\n }\n if (!e.data) return;\n let obj;\n try {\n obj = e.data.json();\n } catch (error) {\n obj = e.data.text();\n }\n\n const title = obj.title || 'Telegram';\n const body = obj.description || obj;\n const options = {\n body,\n icon: 'android-chrome-192x192.png',\n };\n\n e.waitUntil(\n self.registration.showNotification(title, options),\n );\n});\n\nself.addEventListener('notificationclick', (event) => {\n const url = '/';\n event.notification.close(); // Android needs explicit close.\n event.waitUntil(\n self.clients.matchAll({ type: 'window' })\n .then((windowClients) => {\n // Check if there is already a window/tab open with the target URL\n for (let i = 0; i < windowClients.length; i++) {\n const client = windowClients[i] as WindowClient;\n // If so, just focus it.\n if (client.url === url && client.focus) {\n client.focus();\n return;\n }\n }\n // If not, then open the target URL in a new window/tab.\n if (self.clients.openWindow) {\n self.clients.openWindow(url);\n }\n }),\n );\n});\n","import { ASSET_CACHE_NAME } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n if (cached) {\n return cached;\n }\n\n const remote = await fetch(e.request);\n cache.put(e.request, remote.clone());\n\n return remote;\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config.ts","webpack:///./src/serviceWorker/progressive.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/serviceWorker/pushNotification.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/serviceWorker/assetCache.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Set","window","innerHeight","requestStates","Map","async","respondForProgressive","e","url","request","range","headers","bytes","exec","start","Number","originalEnd","end","match","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","cache","self","caches","open","Promise","all","then","arrayBuffer","undefined","json","fetchFromCache","partInfo","params","clientId","client","clients","messageId","store","id","String","Math","random","replace","generateIdFor","requestState","promise","race","ms","resolve","setTimeout","reject","Error","assign","set","catch","finally","delete","postMessage","type","requestPart","err","process","fullSize","partSize","min","byteLength","arrayBufferPart","slice","put","Request","JSON","stringify","saveToCache","NotificationType","addEventListener","result","data","ASSET_CACHE_PATTERN","waitUntil","skipWaiting","claim","respondWith","includes","startsWith","cached","remote","fetch","clone","respondWithCache","error","title","options","body","description","icon","registration","showNotification","notification","close","matchAll","windowClients","length","scope","focus","openWindow"],"mappings":"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","file":"serviceWorker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","export const APP_INFO = process.env.APP_INFO || 'Telegram T';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const CHANNEL_MEMBERS_LIMIT = 30;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import { pause } from '../util/schedulers';\nimport generateIdFor from '../util/generateIdFor';\nimport {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 30000;\n\nconst requestStates = new Map();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const match = e.request.url.match(/fileSize=(\\d+)&mimeType=([\\w/]+)/);\n const fileSize = match && Number(match[1]);\n const mimeType = match && match[2];\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n const cacheKey = `${url}?start=${start}&end=${end}`;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(cacheKey: string) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nasync function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise {\n if (!e.clientId) {\n return undefined;\n }\n\n // eslint-disable-next-line no-restricted-globals\n const client = await self.clients.get(e.clientId);\n if (!client) {\n return undefined;\n }\n\n const messageId = generateIdFor(requestStates);\n const requestState = {} as RequestStates;\n\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => Promise.reject(new Error('ERROR_PART_TIMEOUT'))),\n new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n requestAnimationFrame(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafCallbacks.unshift(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n return fastRaf(callback, true);\n}\n","import { DEBUG } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport enum NotificationType {\n MESSAGE_TEXT = 'MESSAGE_TEXT',\n MESSAGE_NOTEXT = 'MESSAGE_NOTEXT',\n MESSAGE_STICKER = 'MESSAGE_STICKER'\n}\n\nexport type NotificationData = {\n custom: {\n msg_id: string;\n from_id: string;\n };\n mute: '0' | '1';\n badge: '0' | '1';\n loc_key: NotificationType;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\n\nexport function handlePush(e: PushEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received with data', e.data.json());\n }\n }\n if (!e.data) return;\n let data: NotificationData;\n try {\n data = e.data.json();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Unable to parse push notification data', e.data);\n }\n return;\n }\n\n const title = data.title || process.env.APP_INFO!;\n const body = data.description;\n const options = {\n body,\n icon: 'android-chrome-192x192.png',\n };\n\n e.waitUntil(\n self.registration.showNotification(title, options),\n );\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = process.env.APP_URL!;\n e.notification.close(); // Android needs explicit close.\n e.waitUntil(\n self.clients.matchAll({ type: 'window' })\n .then((windowClients) => {\n // Check if there is already a window/tab open with the target URL\n for (let i = 0; i < windowClients.length; i++) {\n const client = windowClients[i] as WindowClient;\n // If so, just focus it.\n if (client.url === self.registration.scope && client.focus) {\n client.focus();\n return;\n }\n }\n // If not, then open the target URL in a new window/tab.\n if (self.clients.openWindow) {\n self.clients.openWindow(appUrl);\n }\n }),\n );\n}\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\nimport { handlePush, handleNotificationClick } from './serviceWorker/pushNotification';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n // Become available to all pages\n e.waitUntil(clearAssetCache());\n e.waitUntil(self.clients.claim());\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n e.respondWith((() => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n return respondForProgressive(e);\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n return respondWithCache(e);\n }\n\n return fetch(e.request);\n })());\n});\n\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\n","import { ASSET_CACHE_NAME } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n if (cached) {\n return cached;\n }\n\n const remote = await fetch(e.request);\n cache.put(e.request, remote.clone());\n\n return remote;\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n"],"sourceRoot":""} \ No newline at end of file